변경 파일 목록
총 162개
Controller (6)
CaptchaController.phpFront/Board/CaptchaController.phpFront/Member/JoinAgreementController.phpFront/Member/JoinController.phpFront/Member/CaptchaController.phpMobile/Board/CaptchaController.phpMobile/Member/data (149)
popup_goods_board_write.htmlskin/front/moment/board/view.htmlskin/front/moment/board/skin/default/write.htmlskin/front/moment/board/skin/default/view.htmlskin/front/moment/board/skin/event/write.htmlskin/front/moment/board/skin/event/view.htmlskin/front/moment/board/skin/gallery/write.htmlskin/front/moment/board/skin/gallery/write.htmlskin/front/moment/board/skin/qa/write.htmlskin/front/moment/board/template/default/write.htmlskin/front/moment/board/template/event/write.htmlskin/front/moment/board/template/gallery/write.htmlskin/front/moment/board/template/qa/goods_board_review_view.htmlskin/front/moment/goods/goods_board_write.htmlskin/front/moment/goods/goods_view.htmlskin/front/moment/goods/altcha.jsskin/front/moment/js/altcha/i18n.jsskin/front/moment/js/altcha/gd_board_goods.jsskin/front/moment/js/gd_board_view.jsskin/front/moment/js/gd_board_write.jsskin/front/moment/js/gd_common.jsskin/front/moment/js/gd_member2.jsskin/front/moment/js/join.htmlskin/front/moment/member/_join_view_captcha.htmlskin/front/moment/member/_altcha.htmlskin/front/moment/share/popup_goods_board_write.htmlskin/front/mygreek/board/view.htmlskin/front/mygreek/board/skin/default/write.htmlskin/front/mygreek/board/skin/default/view.htmlskin/front/mygreek/board/skin/event/write.htmlskin/front/mygreek/board/skin/event/view.htmlskin/front/mygreek/board/skin/gallery/write.htmlskin/front/mygreek/board/skin/gallery/write.htmlskin/front/mygreek/board/skin/qa/write.htmlskin/front/mygreek/board/template/default/write.htmlskin/front/mygreek/board/template/event/write.htmlskin/front/mygreek/board/template/gallery/write.htmlskin/front/mygreek/board/template/qa/goods_board_review_view.htmlskin/front/mygreek/goods/goods_board_write.htmlskin/front/mygreek/goods/goods_view.htmlskin/front/mygreek/goods/altcha.jsskin/front/mygreek/js/altcha/i18n.jsskin/front/mygreek/js/altcha/gd_board_goods.jsskin/front/mygreek/js/gd_board_view.jsskin/front/mygreek/js/gd_board_write.jsskin/front/mygreek/js/gd_common.jsskin/front/mygreek/js/gd_member2.jsskin/front/mygreek/js/join.htmlskin/front/mygreek/member/_join_view_captcha.htmlskin/front/mygreek/member/_altcha.htmlskin/front/mygreek/share/popup_goods_board_write.htmlskin/front/story_g/board/view.htmlskin/front/story_g/board/skin/default/write.htmlskin/front/story_g/board/skin/default/view.htmlskin/front/story_g/board/skin/event/write.htmlskin/front/story_g/board/skin/event/view.htmlskin/front/story_g/board/skin/gallery/write.htmlskin/front/story_g/board/skin/gallery/write.htmlskin/front/story_g/board/skin/qa/write.htmlskin/front/story_g/board/template/default/write.htmlskin/front/story_g/board/template/event/write.htmlskin/front/story_g/board/template/gallery/write.htmlskin/front/story_g/board/template/qa/gd_contents.cssskin/front/story_g/css/gd_goods-view.cssskin/front/story_g/css/goods_board_review_view.htmlskin/front/story_g/goods/goods_board_write.htmlskin/front/story_g/goods/goods_view.htmlskin/front/story_g/goods/altcha.jsskin/front/story_g/js/altcha/i18n.jsskin/front/story_g/js/altcha/gd_board_goods.jsskin/front/story_g/js/gd_board_view.jsskin/front/story_g/js/gd_board_write.jsskin/front/story_g/js/gd_common.jsskin/front/story_g/js/gd_member2.jsskin/front/story_g/js/join.htmlskin/front/story_g/member/_join_view_captcha.htmlskin/front/story_g/member/_altcha.htmlskin/front/story_g/share/view.htmlskin/mobile/moment/board/skin/default/write.htmlskin/mobile/moment/board/skin/default/view.htmlskin/mobile/moment/board/skin/event/write.htmlskin/mobile/moment/board/skin/event/view.htmlskin/mobile/moment/board/skin/gallery/write.htmlskin/mobile/moment/board/skin/gallery/write.htmlskin/mobile/moment/board/skin/qa/write.htmlskin/mobile/moment/board/template/default/write.htmlskin/mobile/moment/board/template/event/write.htmlskin/mobile/moment/board/template/gallery/write.htmlskin/mobile/moment/board/template/qa/goods_board_qa_list.htmlskin/mobile/moment/goods/goods_board_review_list.htmlskin/mobile/moment/goods/goods_board_view.htmlskin/mobile/moment/goods/goods_view.htmlskin/mobile/moment/goods/altcha.jsskin/mobile/moment/js/altcha/i18n.jsskin/mobile/moment/js/altcha/gd_board_view.jsskin/mobile/moment/js/gd_board_write.jsskin/mobile/moment/js/gd_common.jsskin/mobile/moment/js/gd_member2.jsskin/mobile/moment/js/join.htmlskin/mobile/moment/member/_join_view_captcha.htmlskin/mobile/moment/member/_altcha.htmlskin/mobile/moment/share/view.htmlskin/mobile/mygreek/board/skin/default/write.htmlskin/mobile/mygreek/board/skin/default/view.htmlskin/mobile/mygreek/board/skin/event/write.htmlskin/mobile/mygreek/board/skin/event/view.htmlskin/mobile/mygreek/board/skin/gallery/write.htmlskin/mobile/mygreek/board/skin/gallery/write.htmlskin/mobile/mygreek/board/skin/qa/write.htmlskin/mobile/mygreek/board/template/default/write.htmlskin/mobile/mygreek/board/template/event/write.htmlskin/mobile/mygreek/board/template/gallery/write.htmlskin/mobile/mygreek/board/template/qa/goods_board_qa_list.htmlskin/mobile/mygreek/goods/goods_board_review_list.htmlskin/mobile/mygreek/goods/goods_board_view.htmlskin/mobile/mygreek/goods/goods_view.htmlskin/mobile/mygreek/goods/altcha.jsskin/mobile/mygreek/js/altcha/i18n.jsskin/mobile/mygreek/js/altcha/gd_board_view.jsskin/mobile/mygreek/js/gd_board_write.jsskin/mobile/mygreek/js/gd_common.jsskin/mobile/mygreek/js/gd_member2.jsskin/mobile/mygreek/js/join.htmlskin/mobile/mygreek/member/_join_view_captcha.htmlskin/mobile/mygreek/member/_altcha.htmlskin/mobile/mygreek/share/view.htmlskin/mobile/story_g/board/skin/default/write.htmlskin/mobile/story_g/board/skin/default/view.htmlskin/mobile/story_g/board/skin/event/write.htmlskin/mobile/story_g/board/skin/event/view.htmlskin/mobile/story_g/board/skin/gallery/write.htmlskin/mobile/story_g/board/skin/gallery/write.htmlskin/mobile/story_g/board/skin/qa/write.htmlskin/mobile/story_g/board/template/default/write.htmlskin/mobile/story_g/board/template/event/write.htmlskin/mobile/story_g/board/template/gallery/write.htmlskin/mobile/story_g/board/template/qa/goods_board_qa_list.htmlskin/mobile/story_g/goods/goods_board_review_list.htmlskin/mobile/story_g/goods/goods_board_view.htmlskin/mobile/story_g/goods/goods_view.htmlskin/mobile/story_g/goods/altcha.jsskin/mobile/story_g/js/altcha/i18n.jsskin/mobile/story_g/js/altcha/gd_board_view.jsskin/mobile/story_g/js/gd_board_write.jsskin/mobile/story_g/js/gd_common.jsskin/mobile/story_g/js/gd_member2.jsskin/mobile/story_g/js/join.htmlskin/mobile/story_g/member/_join_view_captcha.htmlskin/mobile/story_g/member/_altcha.htmlskin/mobile/story_g/share/변경 파일 코드
추가삭제
변경 전board_register.php
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="1" <?= gd_isset($checked['bdSpamMemoFl'][1]) ?> /> 외부유입차단</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamMemoFl'][2]) ?> /> 자동등록방지문자</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdPasswordMemoFl" | |
| value="y" <?= gd_isset($checked['bdPasswordMemoFl']['y']) ?> /> 비밀댓글 암호보안</label> | |
| value="1" <?= gd_isset($checked['bdSpamBoardFl'][1]) ?> /> 외부유입차단 </label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamBoardFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamBoardFl'][2]) ?> /> | |
| 자동등록방지문자</label> | |
| </td> | |
| </tr> | |
| </table> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="1" <?= gd_isset($checked['bdSpamMemoFl'][1]) ?> /> 외부유입차단</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamMemoFl'][2]) ?> /> 자동등록방지문자</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdPasswordMemoFl" | |
| value="y" <?= gd_isset($checked['bdPasswordMemoFl']['y']) ?> /> 비밀댓글 암호보안</label> | |
| value="1" <?= gd_isset($checked['bdSpamBoardFl'][1]) ?> /> 외부유입차단 </label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamBoardFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamBoardFl'][2]) ?> /> | |
| 자동등록방지문자</label> | |
| </td> | |
| </tr> | |
| </table> | |
변경 후board_register.php
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="1" <?= gd_isset($checked['bdSpamMemoFl'][1]) ?> /> 외부유입차단</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamMemoFl'][2]) ?> /> 자동등록방지</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdPasswordMemoFl" | |
| value="y" <?= gd_isset($checked['bdPasswordMemoFl']['y']) ?> /> 비밀댓글 암호보안</label> | |
| value="1" <?= gd_isset($checked['bdSpamBoardFl'][1]) ?> /> 외부유입차단 </label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamBoardFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamBoardFl'][2]) ?> /> | |
| 자동등록방지</label> | |
| </td> | |
| </tr> | |
| </table> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="1" <?= gd_isset($checked['bdSpamMemoFl'][1]) ?> /> 외부유입차단</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamMemoFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamMemoFl'][2]) ?> /> 자동등록방지</label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdPasswordMemoFl" | |
| value="y" <?= gd_isset($checked['bdPasswordMemoFl']['y']) ?> /> 비밀댓글 암호보안</label> | |
| value="1" <?= gd_isset($checked['bdSpamBoardFl'][1]) ?> /> 외부유입차단 </label> | |
| <label class="checkbox-inline"><input type="checkbox" name="bdSpamBoardFl[]" | |
| value="2" <?= gd_isset($checked['bdSpamBoardFl'][2]) ?> /> | |
| 자동등록방지</label> | |
| </td> | |
| </tr> | |
| </table> | |
변경 전member_joinitem.php
| <col class="width-xs center"/> | |
| </colgroup> | |
| <tr> | |
| <th>자동등록방지문자</th> | |
| <td> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="captcha[use]" value="y"/> | |
| <col class="width-xs center"/> | |
| </colgroup> | |
| <tr> | |
| <th>자동등록방지문자</th> | |
| <td> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="captcha[use]" value="y"/> | |
변경 후member_joinitem.php
| <col class="width-xs center"/> | |
| </colgroup> | |
| <tr> | |
| <th>자동등록방지</th> | |
| <td> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="captcha[use]" value="y"/> | |
| <col class="width-xs center"/> | |
| </colgroup> | |
| <tr> | |
| <th>자동등록방지</th> | |
| <td> | |
| <label class="checkbox-inline" title="사용여부를 선택해주세요!"> | |
| <input type="checkbox" name="captcha[use]" value="y"/> | |
변경 전Board.php
| $switch = ($bdSpamBoardFl & 1 ? '12' : '00') . (($bdSpamBoardFl & 2) ? '3' : '0'); | |
| $rst = BoardUtil::antiSpam(strtoupper(gd_isset($this->req['captchaKey'])), $switch, 'post'); | |
| if (substr($rst['code'], 0, 1) == '4') { | |
| throw new \Exception(__('자동등록방지 문자가 틀렸습니다')); | |
| } | |
| if ($rst['code'] != '0000') { | |
| throw new \Exception(__('무단링크를 금지합니다.')); | |
| $switch = ($bdSpamBoardFl & 1 ? '12' : '00') . (($bdSpamBoardFl & 2) ? '3' : '0'); | |
| $rst = BoardUtil::antiSpam(strtoupper(gd_isset($this->req['captchaKey'])), $switch, 'post'); | |
| if (substr($rst['code'], 0, 1) == '4') { | |
| throw new \Exception(__('자동등록방지 문자가 틀렸습니다')); | |
| } | |
| if ($rst['code'] != '0000') { | |
| throw new \Exception(__('무단링크를 금지합니다.')); | |
변경 후Board.php
| $switch = ($bdSpamBoardFl & 1 ? '12' : '00') . (($bdSpamBoardFl & 2) ? '3' : '0'); | |
| $rst = BoardUtil::antiSpam(strtoupper(gd_isset($this->req['captchaKey'])), $switch, 'post'); | |
| if (substr($rst['code'], 0, 1) == '4') { | |
| \Logger::channel('board')->warning(__METHOD__ . ' 자동등록방지 인증 실패', [ | |
| 'bdId' => $this->cfg['bdId'], | |
| 'code' => $rst['code'], | |
| 'msg' => $rst['msg'], | |
| 'mode' => $this->req['mode'], | |
| 'isMemo' => $isMemo, | |
| ]); | |
| throw new \Exception(__('자동등록방지 인증에 실패했습니다')); | |
| } | |
| if ($rst['code'] != '0000') { | |
| throw new \Exception(__('무단링크를 금지합니다.')); | |
| $switch = ($bdSpamBoardFl & 1 ? '12' : '00') . (($bdSpamBoardFl & 2) ? '3' : '0'); | |
| $rst = BoardUtil::antiSpam(strtoupper(gd_isset($this->req['captchaKey'])), $switch, 'post'); | |
| if (substr($rst['code'], 0, 1) == '4') { | |
| \Logger::channel('board')->warning(__METHOD__ . ' 자동등록방지 인증 실패', [ | |
| 'bdId' => $this->cfg['bdId'], | |
| 'code' => $rst['code'], | |
| 'msg' => $rst['msg'], | |
| 'mode' => $this->req['mode'], | |
| 'isMemo' => $isMemo, | |
| ]); | |
| throw new \Exception(__('자동등록방지 인증에 실패했습니다')); | |
| } | |
| if ($rst['code'] != '0000') { | |
| throw new \Exception(__('무단링크를 금지합니다.')); | |
변경 전BoardUtil.php
| namespace Bundle\Component\Board; | |
| use Bundle\Component\Captcha\Captcha; | |
| use DB; | |
| use Framework\Utility\ArrayUtils; | |
| use Framework\Utility\StringUtils; | |
| return ['code' => '0000', 'msg' => 'Succeed in verifing']; | |
| } | |
| static public function checkCaptcha($captchaKey) { | |
| $captcha = new Captcha(); | |
| $rst = $captcha->verify($captchaKey, 1); | |
| return $rst; | |
| } | |
| /** | |
| * 파일이름을 형식에 맞게 정리하기 | |
| * | |
| namespace Bundle\Component\Board; | |
| use Bundle\Component\Captcha\Captcha; | |
| use DB; | |
| use Framework\Utility\ArrayUtils; | |
| use Framework\Utility\StringUtils; | |
| return ['code' => '0000', 'msg' => 'Succeed in verifing']; | |
| } | |
| static public function checkCaptcha($captchaKey) { | |
| $captcha = new Captcha(); | |
| $rst = $captcha->verify($captchaKey, 1); | |
| return $rst; | |
| } | |
| /** | |
| * 파일이름을 형식에 맞게 정리하기 | |
| * | |
변경 후BoardUtil.php
| namespace Bundle\Component\Board; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Origin\Service\Captcha\AltchaService; | |
| use DB; | |
| use Framework\Utility\ArrayUtils; | |
| use Framework\Utility\StringUtils; | |
| return ['code' => '0000', 'msg' => 'Succeed in verifing']; | |
| } | |
| public static function checkCaptcha($captchaKey) { | |
| // ALTCHA payload 가 있으면 ALTCHA 로, 없으면 기존 이미지 캡차로 검증 (하위 호환) | |
| $altchaPayload = Request::post()->get('altcha'); | |
| if (!empty($altchaPayload)) { | |
| return \App::getInstance(AltchaService::class)->verify((string) $altchaPayload); | |
| } | |
| $captcha = new Captcha(); | |
| $rst = $captcha->verify($captchaKey, 1); | |
| return $rst; | |
| } | |
| /** | |
| * ALTCHA 챌린지 발급 (클라이언트 위젯이 PoW 를 풀기 위해 요청) | |
| * | |
| * ALTCHA v2(KDF) 규격의 challenge 객체를 반환한다. 위젯은 parameters 로 PoW 를 풀고 | |
| * signature 로 서버 위조 검증을 통과한다. (⚠️ 표준 classic 위젯이 아니라 v2 규격 위젯 필요) | |
| * | |
| * @return array{parameters: array{algorithm:string, cost:int, keyLength:int, keyPrefix:string, nonce:string, salt:string, expiresAt:int}, signature:string} | |
| */ | |
| public static function getAltchaChallenge() { | |
| return \App::getInstance(AltchaService::class)->createChallenge(); | |
| } | |
| /** | |
| * 파일이름을 형식에 맞게 정리하기 | |
| * | |
| namespace Bundle\Component\Board; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Origin\Service\Captcha\AltchaService; | |
| use DB; | |
| use Framework\Utility\ArrayUtils; | |
| use Framework\Utility\StringUtils; | |
| return ['code' => '0000', 'msg' => 'Succeed in verifing']; | |
| } | |
| public static function checkCaptcha($captchaKey) { | |
| // ALTCHA payload 가 있으면 ALTCHA 로, 없으면 기존 이미지 캡차로 검증 (하위 호환) | |
| $altchaPayload = Request::post()->get('altcha'); | |
| if (!empty($altchaPayload)) { | |
| return \App::getInstance(AltchaService::class)->verify((string) $altchaPayload); | |
| } | |
| $captcha = new Captcha(); | |
| $rst = $captcha->verify($captchaKey, 1); | |
| return $rst; | |
| } | |
| /** | |
| * ALTCHA 챌린지 발급 (클라이언트 위젯이 PoW 를 풀기 위해 요청) | |
| * | |
| * ALTCHA v2(KDF) 규격의 challenge 객체를 반환한다. 위젯은 parameters 로 PoW 를 풀고 | |
| * signature 로 서버 위조 검증을 통과한다. (⚠️ 표준 classic 위젯이 아니라 v2 규격 위젯 필요) | |
| * | |
| * @return array{parameters: array{algorithm:string, cost:int, keyLength:int, keyPrefix:string, nonce:string, salt:string, expiresAt:int}, signature:string} | |
| */ | |
| public static function getAltchaChallenge() { | |
| return \App::getInstance(AltchaService::class)->createChallenge(); | |
| } | |
| /** | |
| * 파일이름을 형식에 맞게 정리하기 | |
| * | |
변경 전Member.php
| use Bundle\Component\Apple\AppleLogin; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Bundle\Component\Godo\GodoKakaoServerApi; | |
| use Bundle\Component\Policy\KakaoLoginPolicy; | |
| use Component\Database\DBTableField; | |
| use Component\Member\Company\CompanyCertification; | |
| $mall = \APP::load('\\Component\\Mall\\Mall'); | |
| $joinField = MemberUtil::getJoinField($mall->getSession('sno')); | |
| if ($joinField['captcha']['use'] === 'y') { | |
| $captcha = \App::load(Captcha::class); | |
| $rst = $captcha->verify(strtoupper(gd_isset($params['captchaKey'])), 1); | |
| if ($rst['code'] != '0000') { | |
| throw new Exception(__('자동등록방지 문자가 틀렸습니다.')); | |
| } else { | |
| $session->del('captchaGraph1'); | |
| } | |
| use Bundle\Component\Apple\AppleLogin; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Bundle\Component\Godo\GodoKakaoServerApi; | |
| use Bundle\Component\Policy\KakaoLoginPolicy; | |
| use Component\Database\DBTableField; | |
| use Component\Member\Company\CompanyCertification; | |
| $mall = \APP::load('\\Component\\Mall\\Mall'); | |
| $joinField = MemberUtil::getJoinField($mall->getSession('sno')); | |
| if ($joinField['captcha']['use'] === 'y') { | |
| $captcha = \App::load(Captcha::class); | |
| $rst = $captcha->verify(strtoupper(gd_isset($params['captchaKey'])), 1); | |
| if ($rst['code'] != '0000') { | |
| throw new Exception(__('자동등록방지 문자가 틀렸습니다.')); | |
| } else { | |
| $session->del('captchaGraph1'); | |
| } | |
변경 후Member.php
| use Bundle\Component\Apple\AppleLogin; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Bundle\Component\Godo\GodoKakaoServerApi; | |
| use Origin\Service\Captcha\AltchaService; | |
| use Bundle\Component\Policy\KakaoLoginPolicy; | |
| use Component\Database\DBTableField; | |
| use Component\Member\Company\CompanyCertification; | |
| $mall = \APP::load('\\Component\\Mall\\Mall'); | |
| $joinField = MemberUtil::getJoinField($mall->getSession('sno')); | |
| if ($joinField['captcha']['use'] === 'y') { | |
| // ALTCHA payload 가 있으면 ALTCHA 로, 없으면 기존 이미지 캡차로 검증 (하위 호환) | |
| $altchaPayload = gd_isset($params['altcha']); | |
| if (!empty($altchaPayload)) { | |
| $rst = \App::getInstance(AltchaService::class)->verify((string) $altchaPayload); | |
| } else { | |
| $captcha = \App::load(Captcha::class); | |
| $rst = $captcha->verify(strtoupper(gd_isset($params['captchaKey'])), 1); | |
| } | |
| if ($rst['code'] != '0000') { | |
| throw new Exception(__('자동등록방지 인증에 실패했습니다')); | |
| } else { | |
| $session->del('captchaGraph1'); | |
| } | |
| use Bundle\Component\Apple\AppleLogin; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Bundle\Component\Godo\GodoKakaoServerApi; | |
| use Origin\Service\Captcha\AltchaService; | |
| use Bundle\Component\Policy\KakaoLoginPolicy; | |
| use Component\Database\DBTableField; | |
| use Component\Member\Company\CompanyCertification; | |
| $mall = \APP::load('\\Component\\Mall\\Mall'); | |
| $joinField = MemberUtil::getJoinField($mall->getSession('sno')); | |
| if ($joinField['captcha']['use'] === 'y') { | |
| // ALTCHA payload 가 있으면 ALTCHA 로, 없으면 기존 이미지 캡차로 검증 (하위 호환) | |
| $altchaPayload = gd_isset($params['altcha']); | |
| if (!empty($altchaPayload)) { | |
| $rst = \App::getInstance(AltchaService::class)->verify((string) $altchaPayload); | |
| } else { | |
| $captcha = \App::load(Captcha::class); | |
| $rst = $captcha->verify(strtoupper(gd_isset($params['captchaKey'])), 1); | |
| } | |
| if ($rst['code'] != '0000') { | |
| throw new Exception(__('자동등록방지 인증에 실패했습니다')); | |
| } else { | |
| $session->del('captchaGraph1'); | |
| } | |
변경 전CaptchaController.php
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
변경 후CaptchaController.php
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\Bundle\Component\Board\BoardUtil::getAltchaChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\Bundle\Component\Board\BoardUtil::getAltchaChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
변경 전CaptchaController.php
| namespace Bundle\Controller\Front\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
| namespace Bundle\Controller\Front\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
변경 후CaptchaController.php
| namespace Bundle\Controller\Front\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Origin\Service\Captcha\AltchaService; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\App::getInstance(AltchaService::class)->createChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
| namespace Bundle\Controller\Front\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Origin\Service\Captcha\AltchaService; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\App::getInstance(AltchaService::class)->createChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
변경 전JoinAgreementController.php
| $wonderLoginPolicy = gd_policy('member.wonderLogin'); | |
| if (empty(Session::has(GodoWonderServerApi::SESSION_ACCESS_TOKEN)) === false && $wonderLoginPolicy['useFl'] === 'y' && Request::get()->get('joinType') === 'wonder') { | |
| $snsMemberAuthFl = $chkSNSMemberAuthFl; | |
| $siteLink = new \Component\SiteLink\SiteLink(); | |
| $this->setData('joinActionUrl', $siteLink->link('../member/member_ps.php', 'ssl')); | |
| $wonderToken = Session::get(GodoWonderServerApi::SESSION_ACCESS_TOKEN); | |
| $wonderApi = new GodoWonderServerApi(); | |
| $userProfile = $wonderApi->getUserProfile($wonderToken); | |
| $wonderLoginPolicy = gd_policy('member.wonderLogin'); | |
| if (empty(Session::has(GodoWonderServerApi::SESSION_ACCESS_TOKEN)) === false && $wonderLoginPolicy['useFl'] === 'y' && Request::get()->get('joinType') === 'wonder') { | |
| $snsMemberAuthFl = $chkSNSMemberAuthFl; | |
| $siteLink = new \Component\SiteLink\SiteLink(); | |
| $this->setData('joinActionUrl', $siteLink->link('../member/member_ps.php', 'ssl')); | |
| $wonderToken = Session::get(GodoWonderServerApi::SESSION_ACCESS_TOKEN); | |
| $wonderApi = new GodoWonderServerApi(); | |
| $userProfile = $wonderApi->getUserProfile($wonderToken); | |
변경 후JoinAgreementController.php
| $wonderLoginPolicy = gd_policy('member.wonderLogin'); | |
| if (empty(Session::has(GodoWonderServerApi::SESSION_ACCESS_TOKEN)) === false && $wonderLoginPolicy['useFl'] === 'y' && Request::get()->get('joinType') === 'wonder') { | |
| $snsMemberAuthFl = $chkSNSMemberAuthFl; | |
| $this->setData('joinActionUrl', '../member/member_ps.php'); | |
| $wonderToken = Session::get(GodoWonderServerApi::SESSION_ACCESS_TOKEN); | |
| $wonderApi = new GodoWonderServerApi(); | |
| $userProfile = $wonderApi->getUserProfile($wonderToken); | |
| $wonderLoginPolicy = gd_policy('member.wonderLogin'); | |
| if (empty(Session::has(GodoWonderServerApi::SESSION_ACCESS_TOKEN)) === false && $wonderLoginPolicy['useFl'] === 'y' && Request::get()->get('joinType') === 'wonder') { | |
| $snsMemberAuthFl = $chkSNSMemberAuthFl; | |
| $this->setData('joinActionUrl', '../member/member_ps.php'); | |
| $wonderToken = Session::get(GodoWonderServerApi::SESSION_ACCESS_TOKEN); | |
| $wonderApi = new GodoWonderServerApi(); | |
| $userProfile = $wonderApi->getUserProfile($wonderToken); | |
변경 전JoinController.php
| } | |
| $siteLink = new \Component\SiteLink\SiteLink(); | |
| $this->setData('joinField', \Component\Member\Util\MemberUtil::getJoinField(\Component\Mall\Mall::getSession('sno'))); | |
| $this->setData('joinActionUrl', $siteLink->link('../member/member_ps.php', 'ssl')); | |
| $this->setData('data', \Component\Member\Util\MemberUtil::saveJoinInfoBySession($request->post()->all())); | |
| $this->setData('paycoProfile', json_encode($paycoProfile)); | |
| $this->setData('isPaycoJoin', !empty($paycoProfile)); | |
| } | |
| $siteLink = new \Component\SiteLink\SiteLink(); | |
| $this->setData('joinField', \Component\Member\Util\MemberUtil::getJoinField(\Component\Mall\Mall::getSession('sno'))); | |
| $this->setData('joinActionUrl', $siteLink->link('../member/member_ps.php', 'ssl')); | |
| $this->setData('data', \Component\Member\Util\MemberUtil::saveJoinInfoBySession($request->post()->all())); | |
| $this->setData('paycoProfile', json_encode($paycoProfile)); | |
| $this->setData('isPaycoJoin', !empty($paycoProfile)); | |
변경 후JoinController.php
| } | |
| $this->setData('joinField', \Component\Member\Util\MemberUtil::getJoinField(\Component\Mall\Mall::getSession('sno'))); | |
| $this->setData('joinActionUrl', '../member/member_ps.php'); | |
| $this->setData('data', \Component\Member\Util\MemberUtil::saveJoinInfoBySession($request->post()->all())); | |
| $this->setData('paycoProfile', json_encode($paycoProfile)); | |
| $this->setData('isPaycoJoin', !empty($paycoProfile)); | |
| } | |
| $this->setData('joinField', \Component\Member\Util\MemberUtil::getJoinField(\Component\Mall\Mall::getSession('sno'))); | |
| $this->setData('joinActionUrl', '../member/member_ps.php'); | |
| $this->setData('data', \Component\Member\Util\MemberUtil::saveJoinInfoBySession($request->post()->all())); | |
| $this->setData('paycoProfile', json_encode($paycoProfile)); | |
| $this->setData('isPaycoJoin', !empty($paycoProfile)); | |
변경 전CaptchaController.php
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
변경 후CaptchaController.php
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\Bundle\Component\Board\BoardUtil::getAltchaChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\Bundle\Component\Board\BoardUtil::getAltchaChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $db = \App::load('DB'); | |
변경 전CaptchaController.php
| namespace Bundle\Controller\Mobile\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
| namespace Bundle\Controller\Mobile\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
변경 후CaptchaController.php
| namespace Bundle\Controller\Mobile\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Origin\Service\Captcha\AltchaService; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\App::getInstance(AltchaService::class)->createChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
| namespace Bundle\Controller\Mobile\Member; | |
| use Bundle\Component\Captcha\Captcha; | |
| use Origin\Service\Captcha\AltchaService; | |
| use Request; | |
| /** | |
| public function index() | |
| { | |
| try { | |
| // ALTCHA 위젯이 GET 으로 챌린지를 요청하면 JSON 으로 응답 | |
| if (Request::get()->get('mode') === 'altchaChallenge') { | |
| $this->json(\App::getInstance(AltchaService::class)->createChallenge()); | |
| } | |
| $captcha = new Captcha(); | |
| $getData = array(); | |
변경 전AltchaWidget.php
변경 후AltchaWidget.php
| <?php | |
| /* | |
| * Copyright (C) 2026 NHN COMMERCE. - All Rights Reserved | |
| * | |
| * Unauthorized copying or redistribution of this file in source and binary forms via any medium | |
| * is strictly prohibited. | |
| */ | |
| namespace Bundle\Widget\Front\Share; | |
| /** | |
| * Class AltchaWidget | |
| * | |
| * 자동등록방지(ALTCHA) 위젯 공통 파셜(share/_altcha.html) 렌더 진입점. | |
| * 정적 마크업만 출력하며, challenge URL 등은 includeWidget 인자로 setData 되어 파셜에서 사용된다. | |
| * | |
| * @package Bundle\Widget\Front\Share | |
| */ | |
| class AltchaWidget extends \Widget\Front\Widget | |
| { | |
| /** | |
| * @inheritdoc | |
| */ | |
| public function index() | |
| { | |
| // challenge 발급 mode 토큰은 서버 사이드에서 주입 | |
| $this->setData('altchaMode', 'altchaChallenge'); | |
| } | |
| } | |
| <?php | |
| /* | |
| * Copyright (C) 2026 NHN COMMERCE. - All Rights Reserved | |
| * | |
| * Unauthorized copying or redistribution of this file in source and binary forms via any medium | |
| * is strictly prohibited. | |
| */ | |
| namespace Bundle\Widget\Front\Share; | |
| /** | |
| * Class AltchaWidget | |
| * | |
| * 자동등록방지(ALTCHA) 위젯 공통 파셜(share/_altcha.html) 렌더 진입점. | |
| * 정적 마크업만 출력하며, challenge URL 등은 includeWidget 인자로 setData 되어 파셜에서 사용된다. | |
| * | |
| * @package Bundle\Widget\Front\Share | |
| */ | |
| class AltchaWidget extends \Widget\Front\Widget | |
| { | |
| /** | |
| * @inheritdoc | |
| */ | |
| public function index() | |
| { | |
| // challenge 발급 mode 토큰은 서버 사이드에서 주입 | |
| $this->setData('altchaMode', 'altchaChallenge'); | |
| } | |
| } | |
변경 전AltchaWidget.php
변경 후AltchaWidget.php
| <?php | |
| /* | |
| * Copyright (C) 2026 NHN COMMERCE. - All Rights Reserved | |
| * | |
| * Unauthorized copying or redistribution of this file in source and binary forms via any medium | |
| * is strictly prohibited. | |
| */ | |
| namespace Bundle\Widget\Mobile\Share; | |
| /** | |
| * Class AltchaWidget | |
| * | |
| * 자동등록방지(ALTCHA) 위젯 공통 파셜(share/_altcha.html) 렌더 진입점 (모바일). | |
| * 정적 마크업만 출력하며, challenge URL 등은 includeWidget 인자로 setData 되어 파셜에서 사용된다. | |
| * | |
| * @package Bundle\Widget\Mobile\Share | |
| */ | |
| class AltchaWidget extends \Widget\Mobile\Widget | |
| { | |
| /** | |
| * @inheritdoc | |
| */ | |
| public function index() | |
| { | |
| // challenge 발급 mode 토큰은 서버 사이드에서 주입 | |
| $this->setData('altchaMode', 'altchaChallenge'); | |
| } | |
| } | |
| <?php | |
| /* | |
| * Copyright (C) 2026 NHN COMMERCE. - All Rights Reserved | |
| * | |
| * Unauthorized copying or redistribution of this file in source and binary forms via any medium | |
| * is strictly prohibited. | |
| */ | |
| namespace Bundle\Widget\Mobile\Share; | |
| /** | |
| * Class AltchaWidget | |
| * | |
| * 자동등록방지(ALTCHA) 위젯 공통 파셜(share/_altcha.html) 렌더 진입점 (모바일). | |
| * 정적 마크업만 출력하며, challenge URL 등은 includeWidget 인자로 setData 되어 파셜에서 사용된다. | |
| * | |
| * @package Bundle\Widget\Mobile\Share | |
| */ | |
| class AltchaWidget extends \Widget\Mobile\Widget | |
| { | |
| /** | |
| * @inheritdoc | |
| */ | |
| public function index() | |
| { | |
| // challenge 발급 mode 토큰은 서버 사이드에서 주입 | |
| $this->setData('altchaMode', 'altchaChallenge'); | |
| } | |
| } | |
변경 전popup_goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
변경 후popup_goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
변경 전view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전goods_board_review_view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
변경 후goods_board_review_view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
변경 전goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
변경 후goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php', 'altchaSrc', 'y')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php', 'altchaSrc', 'y')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
변경 전goods_view.html
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
변경 후goods_view.html
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
변경 전altcha.js
변경 후altcha.js
| const DEV = false; | |
| var is_array = Array.isArray; | |
| var index_of = Array.prototype.indexOf; | |
| var includes = Array.prototype.includes; | |
| var array_from = Array.from; | |
| var object_keys = Object.keys; | |
| var define_property = Object.defineProperty; | |
| var get_descriptor = Object.getOwnPropertyDescriptor; | |
| var get_descriptors = Object.getOwnPropertyDescriptors; | |
| var object_prototype = Object.prototype; | |
| var array_prototype = Array.prototype; | |
| var get_prototype_of = Object.getPrototypeOf; | |
| var is_extensible = Object.isExtensible; | |
| const noop = () => { | |
| }; | |
| function run_all(arr) { | |
| for (var i = 0; i < arr.length; i++) { | |
| arr[i](); | |
| } | |
| } | |
| function deferred() { | |
| var resolve; | |
| var reject; | |
| var promise = new Promise((res, rej) => { | |
| resolve = res; | |
| reject = rej; | |
| }); | |
| return { promise, resolve, reject }; | |
| } | |
| const DERIVED = 1 << 1; | |
| const EFFECT = 1 << 2; | |
| const RENDER_EFFECT = 1 << 3; | |
| const MANAGED_EFFECT = 1 << 24; | |
| const BLOCK_EFFECT = 1 << 4; | |
| const BRANCH_EFFECT = 1 << 5; | |
| const ROOT_EFFECT = 1 << 6; | |
| const BOUNDARY_EFFECT = 1 << 7; | |
| const CONNECTED = 1 << 9; | |
| const CLEAN = 1 << 10; | |
| const DIRTY = 1 << 11; | |
| const MAYBE_DIRTY = 1 << 12; | |
| const INERT = 1 << 13; | |
| const DESTROYED = 1 << 14; | |
| const REACTION_RAN = 1 << 15; | |
| const DESTROYING = 1 << 25; | |
| const EFFECT_TRANSPARENT = 1 << 16; | |
| const EAGER_EFFECT = 1 << 17; | |
| const HEAD_EFFECT = 1 << 18; | |
| const EFFECT_PRESERVED = 1 << 19; | |
| const USER_EFFECT = 1 << 20; | |
| const WAS_MARKED = 1 << 16; | |
| const REACTION_IS_UPDATING = 1 << 21; | |
| const ASYNC = 1 << 22; | |
| const ERROR_VALUE = 1 << 23; | |
| const STATE_SYMBOL = /* @__PURE__ */ Symbol("$state"); | |
| const LEGACY_PROPS = /* @__PURE__ */ Symbol("legacy props"); | |
| const LOADING_ATTR_SYMBOL = /* @__PURE__ */ Symbol(""); | |
| const ATTRIBUTES_CACHE = /* @__PURE__ */ Symbol("attributes"); | |
| const CLASS_CACHE = /* @__PURE__ */ Symbol("class"); | |
| const STYLE_CACHE = /* @__PURE__ */ Symbol("style"); | |
| const TEXT_CACHE = /* @__PURE__ */ Symbol("text"); | |
| const FORM_RESET_HANDLER = /* @__PURE__ */ Symbol("form reset"); | |
| const STALE_REACTION = new class StaleReactionError extends Error { | |
| name = "StaleReactionError"; | |
| message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; | |
| }(); | |
| const IS_XHTML = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| !!globalThis.document?.contentType && /* @__PURE__ */ globalThis.document.contentType.includes("xml") | |
| ); | |
| const TEXT_NODE = 3; | |
| const COMMENT_NODE = 8; | |
| function equals(value) { | |
| return value === this.v; | |
| } | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function safe_equals(value) { | |
| return !safe_not_equal(value, this.v); | |
| } | |
| function lifecycle_outside_component(name) { | |
| { | |
| throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); | |
| } | |
| } | |
| function async_derived_orphan() { | |
| { | |
| throw new Error(`https://svelte.dev/e/async_derived_orphan`); | |
| } | |
| } | |
| function effect_in_teardown(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_teardown`); | |
| } | |
| } | |
| function effect_in_unowned_derived() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); | |
| } | |
| } | |
| function effect_orphan(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_orphan`); | |
| } | |
| } | |
| function effect_update_depth_exceeded() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); | |
| } | |
| } | |
| function hydration_failed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/hydration_failed`); | |
| } | |
| } | |
| function state_descriptors_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); | |
| } | |
| } | |
| function state_prototype_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_prototype_fixed`); | |
| } | |
| } | |
| function state_unsafe_mutation() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); | |
| } | |
| } | |
| function svelte_boundary_reset_onerror() { | |
| { | |
| throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); | |
| } | |
| } | |
| let tracing_mode_flag = false; | |
| const TEMPLATE_FRAGMENT = 1; | |
| const TEMPLATE_USE_IMPORT_NODE = 1 << 1; | |
| const HYDRATION_START = "["; | |
| const HYDRATION_START_ELSE = "[!"; | |
| const HYDRATION_START_FAILED = "[?"; | |
| const HYDRATION_END = "]"; | |
| const HYDRATION_ERROR = {}; | |
| const UNINITIALIZED = /* @__PURE__ */ Symbol("uninitialized"); | |
| const NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; | |
| const NAMESPACE_SVG = "http://www.w3.org/2000/svg"; | |
| const NAMESPACE_MATHML = "http://www.w3.org/1998/Math/MathML"; | |
| const ATTACHMENT_KEY = "@attach"; | |
| let component_context = null; | |
| function set_component_context(context) { | |
| component_context = context; | |
| } | |
| function push(props, runes = false, fn) { | |
| component_context = { | |
| p: component_context, | |
| i: false, | |
| c: null, | |
| e: null, | |
| s: props, | |
| x: null, | |
| r: ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ), | |
| l: null | |
| }; | |
| } | |
| function pop(component2) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| var effects = context.e; | |
| if (effects !== null) { | |
| context.e = null; | |
| for (var fn of effects) { | |
| create_user_effect(fn); | |
| } | |
| } | |
| if (component2 !== void 0) { | |
| context.x = component2; | |
| } | |
| context.i = true; | |
| component_context = context.p; | |
| return component2 ?? /** @type {T} */ | |
| {}; | |
| } | |
| function is_runes() { | |
| return true; | |
| } | |
| let micro_tasks = []; | |
| function run_micro_tasks() { | |
| var tasks = micro_tasks; | |
| micro_tasks = []; | |
| run_all(tasks); | |
| } | |
| function queue_micro_task(fn) { | |
| if (micro_tasks.length === 0 && !is_flushing_sync) { | |
| var tasks = micro_tasks; | |
| queueMicrotask(() => { | |
| if (tasks === micro_tasks) run_micro_tasks(); | |
| }); | |
| } | |
| micro_tasks.push(fn); | |
| } | |
| function flush_tasks() { | |
| while (micro_tasks.length > 0) { | |
| run_micro_tasks(); | |
| } | |
| } | |
| function derived_inert() { | |
| { | |
| console.warn(`https://svelte.dev/e/derived_inert`); | |
| } | |
| } | |
| function hydration_mismatch(location2) { | |
| { | |
| console.warn(`https://svelte.dev/e/hydration_mismatch`); | |
| } | |
| } | |
| function select_multiple_invalid_value() { | |
| { | |
| console.warn(`https://svelte.dev/e/select_multiple_invalid_value`); | |
| } | |
| } | |
| function svelte_boundary_reset_noop() { | |
| { | |
| console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`); | |
| } | |
| } | |
| let hydrating = false; | |
| function set_hydrating(value) { | |
| hydrating = value; | |
| } | |
| let hydrate_node; | |
| function set_hydrate_node(node) { | |
| if (node === null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return hydrate_node = node; | |
| } | |
| function hydrate_next() { | |
| return set_hydrate_node(/* @__PURE__ */ get_next_sibling(hydrate_node)); | |
| } | |
| function reset(node) { | |
| if (!hydrating) return; | |
| if (/* @__PURE__ */ get_next_sibling(hydrate_node) !== null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| hydrate_node = node; | |
| } | |
| function next(count = 1) { | |
| if (hydrating) { | |
| var i = count; | |
| var node = hydrate_node; | |
| while (i--) { | |
| node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node); | |
| } | |
| hydrate_node = node; | |
| } | |
| } | |
| function skip_nodes(remove = true) { | |
| var depth = 0; | |
| var node = hydrate_node; | |
| while (true) { | |
| if (node.nodeType === COMMENT_NODE) { | |
| var data = ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| if (data === HYDRATION_END) { | |
| if (depth === 0) return node; | |
| depth -= 1; | |
| } else if (data === HYDRATION_START || data === HYDRATION_START_ELSE || // "[1", "[2", etc. for if blocks | |
| data[0] === "[" && !isNaN(Number(data.slice(1)))) { | |
| depth += 1; | |
| } | |
| } | |
| var next2 = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node) | |
| ); | |
| if (remove) node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function read_hydration_instruction(node) { | |
| if (!node || node.nodeType !== COMMENT_NODE) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| } | |
| function proxy(value) { | |
| if (typeof value !== "object" || value === null || STATE_SYMBOL in value) { | |
| return value; | |
| } | |
| const prototype = get_prototype_of(value); | |
| if (prototype !== object_prototype && prototype !== array_prototype) { | |
| return value; | |
| } | |
| var sources = /* @__PURE__ */ new Map(); | |
| var is_proxied_array = is_array(value); | |
| var version = /* @__PURE__ */ state(0); | |
| var parent_version = update_version; | |
| var with_parent = (fn) => { | |
| if (update_version === parent_version) { | |
| return fn(); | |
| } | |
| var reaction = active_reaction; | |
| var version2 = update_version; | |
| set_active_reaction(null); | |
| set_update_version(parent_version); | |
| var result = fn(); | |
| set_active_reaction(reaction); | |
| set_update_version(version2); | |
| return result; | |
| }; | |
| if (is_proxied_array) { | |
| sources.set("length", /* @__PURE__ */ state( | |
| /** @type {any[]} */ | |
| value.length | |
| )); | |
| } | |
| return new Proxy( | |
| /** @type {any} */ | |
| value, | |
| { | |
| defineProperty(_, prop2, descriptor) { | |
| if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) { | |
| state_descriptors_fixed(); | |
| } | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| with_parent(() => { | |
| var s2 = /* @__PURE__ */ state(descriptor.value); | |
| sources.set(prop2, s2); | |
| return s2; | |
| }); | |
| } else { | |
| set(s, descriptor.value, true); | |
| } | |
| return true; | |
| }, | |
| deleteProperty(target, prop2) { | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| if (prop2 in target) { | |
| const s2 = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(prop2, s2); | |
| increment(version); | |
| } | |
| } else { | |
| set(s, UNINITIALIZED); | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| get(target, prop2, receiver) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return value; | |
| } | |
| var s = sources.get(prop2); | |
| var exists = prop2 in target; | |
| if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) { | |
| s = with_parent(() => { | |
| var p = proxy(exists ? target[prop2] : UNINITIALIZED); | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| if (s !== void 0) { | |
| var v = get(s); | |
| return v === UNINITIALIZED ? void 0 : v; | |
| } | |
| return Reflect.get(target, prop2, receiver); | |
| }, | |
| getOwnPropertyDescriptor(target, prop2) { | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor && "value" in descriptor) { | |
| var s = sources.get(prop2); | |
| if (s) descriptor.value = get(s); | |
| } else if (descriptor === void 0) { | |
| var source2 = sources.get(prop2); | |
| var value2 = source2?.v; | |
| if (source2 !== void 0 && value2 !== UNINITIALIZED) { | |
| return { | |
| enumerable: true, | |
| configurable: true, | |
| value: value2, | |
| writable: true | |
| }; | |
| } | |
| } | |
| return descriptor; | |
| }, | |
| has(target, prop2) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return true; | |
| } | |
| var s = sources.get(prop2); | |
| var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2); | |
| if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) { | |
| if (s === void 0) { | |
| s = with_parent(() => { | |
| var p = has ? proxy(target[prop2]) : UNINITIALIZED; | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| var value2 = get(s); | |
| if (value2 === UNINITIALIZED) { | |
| return false; | |
| } | |
| } | |
| return has; | |
| }, | |
| set(target, prop2, value2, receiver) { | |
| var s = sources.get(prop2); | |
| var has = prop2 in target; | |
| if (is_proxied_array && prop2 === "length") { | |
| for (var i = value2; i < /** @type {Source<number>} */ | |
| s.v; i += 1) { | |
| var other_s = sources.get(i + ""); | |
| if (other_s !== void 0) { | |
| set(other_s, UNINITIALIZED); | |
| } else if (i in target) { | |
| other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(i + "", other_s); | |
| } | |
| } | |
| } | |
| if (s === void 0) { | |
| if (!has || get_descriptor(target, prop2)?.writable) { | |
| s = with_parent(() => /* @__PURE__ */ state(void 0)); | |
| set(s, proxy(value2)); | |
| sources.set(prop2, s); | |
| } | |
| } else { | |
| has = s.v !== UNINITIALIZED; | |
| var p = with_parent(() => proxy(value2)); | |
| set(s, p); | |
| } | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor?.set) { | |
| descriptor.set.call(receiver, value2); | |
| } | |
| if (!has) { | |
| if (is_proxied_array && typeof prop2 === "string") { | |
| var ls = ( | |
| /** @type {Source<number>} */ | |
| sources.get("length") | |
| ); | |
| var n = Number(prop2); | |
| if (Number.isInteger(n) && n >= ls.v) { | |
| set(ls, n + 1); | |
| } | |
| } | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| ownKeys(target) { | |
| get(version); | |
| var own_keys = Reflect.ownKeys(target).filter((key3) => { | |
| var source3 = sources.get(key3); | |
| return source3 === void 0 || source3.v !== UNINITIALIZED; | |
| }); | |
| for (var [key2, source2] of sources) { | |
| if (source2.v !== UNINITIALIZED && !(key2 in target)) { | |
| own_keys.push(key2); | |
| } | |
| } | |
| return own_keys; | |
| }, | |
| setPrototypeOf() { | |
| state_prototype_fixed(); | |
| } | |
| } | |
| ); | |
| } | |
| function get_proxied_value(value) { | |
| try { | |
| if (value !== null && typeof value === "object" && STATE_SYMBOL in value) { | |
| return value[STATE_SYMBOL]; | |
| } | |
| } catch { | |
| } | |
| return value; | |
| } | |
| function is(a, b) { | |
| return Object.is(get_proxied_value(a), get_proxied_value(b)); | |
| } | |
| var $window; | |
| var $document; | |
| var is_firefox; | |
| var first_child_getter; | |
| var next_sibling_getter; | |
| function init_operations() { | |
| if ($window !== void 0) { | |
| return; | |
| } | |
| $window = window; | |
| $document = document; | |
| is_firefox = /Firefox/.test(navigator.userAgent); | |
| var element_prototype = Element.prototype; | |
| var node_prototype = Node.prototype; | |
| var text_prototype = Text.prototype; | |
| first_child_getter = get_descriptor(node_prototype, "firstChild").get; | |
| next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; | |
| if (is_extensible(element_prototype)) { | |
| element_prototype[CLASS_CACHE] = void 0; | |
| element_prototype[ATTRIBUTES_CACHE] = null; | |
| element_prototype[STYLE_CACHE] = void 0; | |
| element_prototype.__e = void 0; | |
| } | |
| if (is_extensible(text_prototype)) { | |
| text_prototype[TEXT_CACHE] = void 0; | |
| } | |
| } | |
| function create_text(value = "") { | |
| return document.createTextNode(value); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_first_child(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| first_child_getter.call(node) | |
| ); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_next_sibling(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| next_sibling_getter.call(node) | |
| ); | |
| } | |
| function child(node, is_text) { | |
| if (!hydrating) { | |
| return /* @__PURE__ */ get_first_child(node); | |
| } | |
| var child2 = /* @__PURE__ */ get_first_child(hydrate_node); | |
| if (child2 === null) { | |
| child2 = hydrate_node.appendChild(create_text()); | |
| } else if (is_text && child2.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| child2?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| if (is_text) { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| child2 | |
| ); | |
| } | |
| set_hydrate_node(child2); | |
| return child2; | |
| } | |
| function first_child(node, is_text = false) { | |
| if (!hydrating) { | |
| var first = /* @__PURE__ */ get_first_child(node); | |
| if (first instanceof Comment && first.data === "") return /* @__PURE__ */ get_next_sibling(first); | |
| return first; | |
| } | |
| if (is_text) { | |
| if (hydrate_node?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| hydrate_node?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| hydrate_node | |
| ); | |
| } | |
| return hydrate_node; | |
| } | |
| function sibling(node, count = 1, is_text = false) { | |
| let next_sibling = hydrating ? hydrate_node : node; | |
| var last_sibling; | |
| while (count--) { | |
| last_sibling = next_sibling; | |
| next_sibling = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(next_sibling); | |
| } | |
| if (!hydrating) { | |
| return next_sibling; | |
| } | |
| if (is_text) { | |
| if (next_sibling?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| if (next_sibling === null) { | |
| last_sibling?.after(text2); | |
| } else { | |
| next_sibling.before(text2); | |
| } | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| next_sibling | |
| ); | |
| } | |
| set_hydrate_node(next_sibling); | |
| return next_sibling; | |
| } | |
| function clear_text_content(node) { | |
| node.textContent = ""; | |
| } | |
| function should_defer_append() { | |
| return false; | |
| } | |
| function create_element(tag, namespace, is2) { | |
| let options = void 0; | |
| return ( | |
| /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ | |
| document.createElementNS(namespace ?? NAMESPACE_HTML, tag, options) | |
| ); | |
| } | |
| function merge_text_nodes(text2) { | |
| if ( | |
| /** @type {string} */ | |
| text2.nodeValue.length < 65536 | |
| ) { | |
| return; | |
| } | |
| let next2 = text2.nextSibling; | |
| while (next2 !== null && next2.nodeType === TEXT_NODE) { | |
| next2.remove(); | |
| text2.nodeValue += /** @type {string} */ | |
| next2.nodeValue; | |
| next2 = text2.nextSibling; | |
| } | |
| } | |
| function handle_error(error) { | |
| var effect2 = active_effect; | |
| if (effect2 === null) { | |
| active_reaction.f |= ERROR_VALUE; | |
| return error; | |
| } | |
| if ((effect2.f & REACTION_RAN) === 0 && (effect2.f & EFFECT) === 0) { | |
| throw error; | |
| } | |
| invoke_error_boundary(error, effect2); | |
| } | |
| function invoke_error_boundary(error, effect2) { | |
| while (effect2 !== null) { | |
| if ((effect2.f & BOUNDARY_EFFECT) !== 0) { | |
| if ((effect2.f & REACTION_RAN) === 0) { | |
| throw error; | |
| } | |
| try { | |
| effect2.b.error(error); | |
| return; | |
| } catch (e) { | |
| error = e; | |
| } | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| throw error; | |
| } | |
| const STATUS_MASK = -7169; | |
| function set_signal_status(signal, status) { | |
| signal.f = signal.f & STATUS_MASK | status; | |
| } | |
| function update_derived_status(derived2) { | |
| if ((derived2.f & CONNECTED) !== 0 || derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| } else { | |
| set_signal_status(derived2, MAYBE_DIRTY); | |
| } | |
| } | |
| function clear_marked(deps) { | |
| if (deps === null) return; | |
| for (const dep of deps) { | |
| if ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) { | |
| continue; | |
| } | |
| dep.f ^= WAS_MARKED; | |
| clear_marked( | |
| /** @type {Derived} */ | |
| dep.deps | |
| ); | |
| } | |
| } | |
| function defer_effect(effect2, dirty_effects, maybe_dirty_effects) { | |
| if ((effect2.f & DIRTY) !== 0) { | |
| dirty_effects.add(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| maybe_dirty_effects.add(effect2); | |
| } | |
| clear_marked(effect2.deps); | |
| set_signal_status(effect2, CLEAN); | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set2(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set2(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set2, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set: set2, update, subscribe }; | |
| } | |
| function get$1(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let IS_UNMOUNTED = /* @__PURE__ */ Symbol("unmounted"); | |
| function store_get(store2, store_name, stores) { | |
| const entry = stores[store_name] ??= { | |
| store: null, | |
| source: /* @__PURE__ */ mutable_source(void 0), | |
| unsubscribe: noop | |
| }; | |
| if (entry.store !== store2 && !(IS_UNMOUNTED in stores)) { | |
| entry.unsubscribe(); | |
| entry.store = store2 ?? null; | |
| if (store2 == null) { | |
| entry.source.v = void 0; | |
| entry.unsubscribe = noop; | |
| } else { | |
| var is_synchronous_callback = true; | |
| entry.unsubscribe = subscribe_to_store(store2, (v) => { | |
| if (is_synchronous_callback) { | |
| entry.source.v = v; | |
| } else { | |
| set(entry.source, v); | |
| } | |
| }); | |
| is_synchronous_callback = false; | |
| } | |
| } | |
| if (store2 && IS_UNMOUNTED in stores) { | |
| return get$1(store2); | |
| } | |
| return get(entry.source); | |
| } | |
| function setup_stores() { | |
| const stores = {}; | |
| function cleanup() { | |
| teardown(() => { | |
| for (var store_name in stores) { | |
| const ref = stores[store_name]; | |
| ref.unsubscribe(); | |
| } | |
| define_property(stores, IS_UNMOUNTED, { | |
| enumerable: false, | |
| value: true | |
| }); | |
| }); | |
| } | |
| return [stores, cleanup]; | |
| } | |
| let first_batch = null; | |
| let last_batch = null; | |
| let current_batch = null; | |
| let previous_batch = null; | |
| let batch_values = null; | |
| let last_scheduled_effect = null; | |
| let is_flushing_sync = false; | |
| let is_processing = false; | |
| let collected_effects = null; | |
| let legacy_updates = null; | |
| var flush_count = 0; | |
| var source_stacks = /* @__PURE__ */ new Set(); | |
| let uid = 1; | |
| class Batch { | |
| id = uid++; | |
| /** True as soon as `#process` was called */ | |
| #started = false; | |
| linked = true; | |
| /** @type {Batch | null} */ | |
| #prev = null; | |
| /** @type {Batch | null} */ | |
| #next = null; | |
| /** @type {Map<Effect, ReturnType<typeof deferred<any>>>} */ | |
| async_deriveds = /* @__PURE__ */ new Map(); | |
| /** | |
| * The current values of any signals that are updated in this batch. | |
| * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment) | |
| * They keys of this map are identical to `this.#previous` | |
| * @type {Map<Value, [any, boolean]>} | |
| */ | |
| current = /* @__PURE__ */ new Map(); | |
| /** | |
| * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place. | |
| * They keys of this map are identical to `this.#current` | |
| * @type {Map<Value, any>} | |
| */ | |
| previous = /* @__PURE__ */ new Map(); | |
| /** | |
| * Async effects which this batch doesn't take into account anymore when calculating blockers, | |
| * as it has a value for it already. | |
| * @type {Set<Effect>} | |
| */ | |
| unblocked = /* @__PURE__ */ new Set(); | |
| /** | |
| * When the batch is committed (and the DOM is updated), we need to remove old branches | |
| * and append new ones by calling the functions added inside (if/each/key/etc) blocks | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * If a fork is discarded, we need to destroy any effects that are no longer needed | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #discard_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * Callbacks that should run only when a fork is committed. | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #fork_commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * The number of async effects that are currently in flight | |
| */ | |
| #pending = 0; | |
| /** | |
| * Async effects that are currently in flight, _not_ inside a pending boundary | |
| * @type {Map<Effect, number>} | |
| */ | |
| #blocking_pending = /* @__PURE__ */ new Map(); | |
| /** | |
| * A deferred that resolves when the batch is committed, used with `settled()` | |
| * TODO replace with Promise.withResolvers once supported widely enough | |
| * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null} | |
| */ | |
| #deferred = null; | |
| /** | |
| * The root effects that need to be flushed | |
| * @type {Effect[]} | |
| */ | |
| #roots = []; | |
| /** | |
| * Effects created while this batch was active. | |
| * @type {Effect[]} | |
| */ | |
| #new_effects = []; | |
| /** | |
| * Deferred effects (which run after async work has completed) that are DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * Deferred effects that are MAYBE_DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A map of branches that still exist, but will be destroyed when this batch | |
| * is committed — we skip over these during `process`. | |
| * The value contains child effects that were dirty/maybe_dirty before being reset, | |
| * so they can be rescheduled if the branch survives. | |
| * @type {Map<Effect, { d: Effect[], m: Effect[] }>} | |
| */ | |
| #skipped_branches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing | |
| * @type {Set<Effect>} | |
| */ | |
| #unskipped_branches = /* @__PURE__ */ new Set(); | |
| is_fork = false; | |
| #decrement_queued = false; | |
| #is_deferred() { | |
| if (this.is_fork) return true; | |
| for (const effect2 of this.#blocking_pending.keys()) { | |
| var e = effect2; | |
| var skipped = false; | |
| while (e.parent !== null) { | |
| if (this.#skipped_branches.has(e)) { | |
| skipped = true; | |
| break; | |
| } | |
| e = e.parent; | |
| } | |
| if (!skipped) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Add an effect to the #skipped_branches map and reset its children | |
| * @param {Effect} effect | |
| */ | |
| skip_effect(effect2) { | |
| if (!this.#skipped_branches.has(effect2)) { | |
| this.#skipped_branches.set(effect2, { d: [], m: [] }); | |
| } | |
| this.#unskipped_branches.delete(effect2); | |
| } | |
| /** | |
| * Remove an effect from the #skipped_branches map and reschedule | |
| * any tracked dirty/maybe_dirty child effects | |
| * @param {Effect} effect | |
| * @param {(e: Effect) => void} callback | |
| */ | |
| unskip_effect(effect2, callback = (e) => this.schedule(e)) { | |
| var tracked = this.#skipped_branches.get(effect2); | |
| if (tracked) { | |
| this.#skipped_branches.delete(effect2); | |
| for (var e of tracked.d) { | |
| set_signal_status(e, DIRTY); | |
| callback(e); | |
| } | |
| for (e of tracked.m) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| callback(e); | |
| } | |
| } | |
| this.#unskipped_branches.add(effect2); | |
| } | |
| #process() { | |
| this.#started = true; | |
| if (flush_count++ > 1e3) { | |
| this.#unlink(); | |
| infinite_loop_guard(); | |
| } | |
| if (!this.#is_deferred()) { | |
| for (const e of this.#dirty_effects) { | |
| this.#maybe_dirty_effects.delete(e); | |
| set_signal_status(e, DIRTY); | |
| this.schedule(e); | |
| } | |
| for (const e of this.#maybe_dirty_effects) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| this.schedule(e); | |
| } | |
| } | |
| const roots = this.#roots; | |
| this.#roots = []; | |
| this.apply(); | |
| var effects = collected_effects = []; | |
| var render_effects = []; | |
| var updates = legacy_updates = []; | |
| for (const root2 of roots) { | |
| try { | |
| this.#traverse(root2, effects, render_effects); | |
| } catch (e) { | |
| reset_all(root2); | |
| throw e; | |
| } | |
| } | |
| current_batch = null; | |
| if (updates.length > 0) { | |
| var batch = Batch.ensure(); | |
| for (const e of updates) { | |
| batch.schedule(e); | |
| } | |
| } | |
| collected_effects = null; | |
| legacy_updates = null; | |
| if (this.#is_deferred()) { | |
| this.#defer_effects(render_effects); | |
| this.#defer_effects(effects); | |
| for (const [e, t] of this.#skipped_branches) { | |
| reset_branch(e, t); | |
| } | |
| if (updates.length > 0) { | |
| /** @type {unknown} */ | |
| current_batch.#process(); | |
| } | |
| return; | |
| } | |
| const earlier_batch = this.#find_earlier_batch(); | |
| if (earlier_batch) { | |
| earlier_batch.#merge(this); | |
| return; | |
| } | |
| this.#dirty_effects.clear(); | |
| this.#maybe_dirty_effects.clear(); | |
| for (const fn of this.#commit_callbacks) fn(this); | |
| this.#commit_callbacks.clear(); | |
| previous_batch = this; | |
| flush_queued_effects(render_effects); | |
| flush_queued_effects(effects); | |
| previous_batch = null; | |
| this.#deferred?.resolve(); | |
| var next_batch = ( | |
| /** @type {Batch | null} */ | |
| /** @type {unknown} */ | |
| current_batch | |
| ); | |
| if (this.linked && this.#pending === 0) { | |
| this.#unlink(); | |
| } | |
| if (this.#roots.length > 0) { | |
| if (next_batch === null) { | |
| next_batch = this; | |
| this.#link(); | |
| } | |
| const batch2 = next_batch; | |
| batch2.#roots.push(...this.#roots.filter((r2) => !batch2.#roots.includes(r2))); | |
| } | |
| if (next_batch !== null) { | |
| next_batch.#process(); | |
| } | |
| } | |
| /** | |
| * Traverse the effect tree, executing effects or stashing | |
| * them for later execution as appropriate | |
| * @param {Effect} root | |
| * @param {Effect[]} effects | |
| * @param {Effect[]} render_effects | |
| */ | |
| #traverse(root2, effects, render_effects) { | |
| root2.f ^= CLEAN; | |
| var effect2 = root2.first; | |
| while (effect2 !== null) { | |
| var flags2 = effect2.f; | |
| var is_branch = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; | |
| var is_skippable_branch = is_branch && (flags2 & CLEAN) !== 0; | |
| var skip = is_skippable_branch || (flags2 & INERT) !== 0 || this.#skipped_branches.has(effect2); | |
| if (!skip && effect2.fn !== null) { | |
| if (is_branch) { | |
| effect2.f ^= CLEAN; | |
| } else if ((flags2 & EFFECT) !== 0) { | |
| effects.push(effect2); | |
| } else if (is_dirty(effect2)) { | |
| if ((flags2 & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect2); | |
| update_effect(effect2); | |
| } | |
| var child2 = effect2.first; | |
| if (child2 !== null) { | |
| effect2 = child2; | |
| continue; | |
| } | |
| } | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if (next2 !== null) { | |
| effect2 = next2; | |
| break; | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| } | |
| } | |
| #find_earlier_batch() { | |
| var batch = this.#prev; | |
| while (batch !== null) { | |
| if (!batch.is_fork) { | |
| for (const [value, [, is_derived]] of this.current) { | |
| if (batch.current.has(value) && !is_derived) { | |
| return batch; | |
| } | |
| } | |
| } | |
| batch = batch.#prev; | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #merge(batch) { | |
| for (const [source2, value] of batch.current) { | |
| if (!this.previous.has(source2) && batch.previous.has(source2)) { | |
| this.previous.set(source2, batch.previous.get(source2)); | |
| } | |
| this.current.set(source2, value); | |
| } | |
| for (const [effect2, deferred2] of batch.async_deriveds) { | |
| const d = this.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| const mark = (value) => { | |
| var reactions = value.reactions; | |
| if (reactions === null) return; | |
| for (const reaction of reactions) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| } else { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if (flags2 & (ASYNC | BLOCK_EFFECT) && !this.async_deriveds.has(effect2)) { | |
| this.#maybe_dirty_effects.delete(effect2); | |
| set_signal_status(effect2, DIRTY); | |
| this.schedule(effect2); | |
| } | |
| } | |
| } | |
| }; | |
| for (const source2 of this.current.keys()) { | |
| mark(source2); | |
| } | |
| this.oncommit(() => batch.discard()); | |
| batch.#unlink(); | |
| current_batch = this; | |
| this.#process(); | |
| } | |
| /** | |
| * @param {Effect[]} effects | |
| */ | |
| #defer_effects(effects) { | |
| for (var i = 0; i < effects.length; i += 1) { | |
| defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| } | |
| /** | |
| * Associate a change to a given source with the current | |
| * batch, noting its previous and current values | |
| * @param {Value} source | |
| * @param {any} value | |
| * @param {boolean} [is_derived] | |
| */ | |
| capture(source2, value, is_derived = false) { | |
| if (source2.v !== UNINITIALIZED && !this.previous.has(source2)) { | |
| this.previous.set(source2, source2.v); | |
| } | |
| if ((source2.f & ERROR_VALUE) === 0) { | |
| this.current.set(source2, [value, is_derived]); | |
| batch_values?.set(source2, value); | |
| } | |
| if (!this.is_fork) { | |
| source2.v = value; | |
| } | |
| } | |
| activate() { | |
| current_batch = this; | |
| } | |
| deactivate() { | |
| current_batch = null; | |
| batch_values = null; | |
| } | |
| flush() { | |
| try { | |
| if (DEV) ; | |
| is_processing = true; | |
| current_batch = this; | |
| this.#process(); | |
| } finally { | |
| flush_count = 0; | |
| last_scheduled_effect = null; | |
| collected_effects = null; | |
| legacy_updates = null; | |
| is_processing = false; | |
| current_batch = null; | |
| batch_values = null; | |
| old_values.clear(); | |
| } | |
| } | |
| discard() { | |
| for (const fn of this.#discard_callbacks) fn(this); | |
| this.#discard_callbacks.clear(); | |
| this.#fork_commit_callbacks.clear(); | |
| this.#unlink(); | |
| } | |
| /** | |
| * @param {Effect} effect | |
| */ | |
| register_created_effect(effect2) { | |
| this.#new_effects.push(effect2); | |
| } | |
| #commit() { | |
| this.#unlink(); | |
| for (let batch = first_batch; batch !== null; batch = batch.#next) { | |
| var is_earlier = batch.id < this.id; | |
| var sources = []; | |
| for (const [source3, [value, is_derived]] of this.current) { | |
| if (batch.current.has(source3)) { | |
| var batch_value = ( | |
| /** @type {[any, boolean]} */ | |
| batch.current.get(source3)[0] | |
| ); | |
| if (is_earlier && value !== batch_value) { | |
| batch.current.set(source3, [value, is_derived]); | |
| } else { | |
| continue; | |
| } | |
| } | |
| sources.push(source3); | |
| } | |
| if (is_earlier) { | |
| for (const [effect2, deferred2] of this.async_deriveds) { | |
| const d = batch.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| } | |
| if (!batch.#started) continue; | |
| var others = [...batch.current.keys()].filter((s) => !this.current.has(s)); | |
| if (others.length === 0) { | |
| if (is_earlier) { | |
| batch.discard(); | |
| } | |
| } else if (sources.length > 0) { | |
| if (is_earlier) { | |
| for (const unskipped of this.#unskipped_branches) { | |
| batch.unskip_effect(unskipped, (e) => { | |
| if ((e.f & (BLOCK_EFFECT | ASYNC)) !== 0) { | |
| batch.schedule(e); | |
| } else { | |
| batch.#defer_effects([e]); | |
| } | |
| }); | |
| } | |
| } | |
| batch.activate(); | |
| var marked = /* @__PURE__ */ new Set(); | |
| var checked = /* @__PURE__ */ new Map(); | |
| for (var source2 of sources) { | |
| mark_effects(source2, others, marked, checked); | |
| } | |
| checked = /* @__PURE__ */ new Map(); | |
| var current_unequal = [...batch.current.keys()].filter( | |
| (c) => this.current.has(c) ? ( | |
| /** @type {[any, boolean]} */ | |
| this.current.get(c)[0] !== c.v | |
| ) : true | |
| ); | |
| if (current_unequal.length > 0) { | |
| for (const effect2 of this.#new_effects) { | |
| if ((effect2.f & (DESTROYED | INERT | EAGER_EFFECT)) === 0 && depends_on(effect2, current_unequal, checked)) { | |
| if ((effect2.f & (ASYNC | BLOCK_EFFECT)) !== 0) { | |
| set_signal_status(effect2, DIRTY); | |
| batch.schedule(effect2); | |
| } else { | |
| batch.#dirty_effects.add(effect2); | |
| } | |
| } | |
| } | |
| } | |
| if (batch.#roots.length > 0) { | |
| batch.apply(); | |
| for (var root2 of batch.#roots) { | |
| batch.#traverse(root2, [], []); | |
| } | |
| batch.#roots = []; | |
| } | |
| batch.deactivate(); | |
| } | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| increment(blocking, effect2) { | |
| this.#pending += 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| this.#blocking_pending.set(effect2, blocking_pending_count + 1); | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| decrement(blocking, effect2) { | |
| this.#pending -= 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| if (blocking_pending_count === 1) { | |
| this.#blocking_pending.delete(effect2); | |
| } else { | |
| this.#blocking_pending.set(effect2, blocking_pending_count - 1); | |
| } | |
| } | |
| if (this.#decrement_queued) return; | |
| this.#decrement_queued = true; | |
| queue_micro_task(() => { | |
| this.#decrement_queued = false; | |
| if (this.linked) { | |
| this.flush(); | |
| } | |
| }); | |
| } | |
| /** | |
| * @param {Set<Effect>} dirty_effects | |
| * @param {Set<Effect>} maybe_dirty_effects | |
| */ | |
| transfer_effects(dirty_effects, maybe_dirty_effects) { | |
| for (const e of dirty_effects) { | |
| this.#dirty_effects.add(e); | |
| } | |
| for (const e of maybe_dirty_effects) { | |
| this.#maybe_dirty_effects.add(e); | |
| } | |
| dirty_effects.clear(); | |
| maybe_dirty_effects.clear(); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| oncommit(fn) { | |
| this.#commit_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| ondiscard(fn) { | |
| this.#discard_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| on_fork_commit(fn) { | |
| this.#fork_commit_callbacks.add(fn); | |
| } | |
| run_fork_commit_callbacks() { | |
| for (const fn of this.#fork_commit_callbacks) fn(this); | |
| this.#fork_commit_callbacks.clear(); | |
| } | |
| settled() { | |
| return (this.#deferred ??= deferred()).promise; | |
| } | |
| static ensure() { | |
| if (current_batch === null) { | |
| const batch = current_batch = new Batch(); | |
| batch.#link(); | |
| if (!is_processing && !is_flushing_sync) { | |
| queue_micro_task(() => { | |
| if (!batch.#started) { | |
| batch.flush(); | |
| } | |
| }); | |
| } | |
| } | |
| return current_batch; | |
| } | |
| apply() { | |
| { | |
| batch_values = null; | |
| return; | |
| } | |
| } | |
| /** | |
| * | |
| * @param {Effect} effect | |
| */ | |
| schedule(effect2) { | |
| last_scheduled_effect = effect2; | |
| if (effect2.b?.is_pending && (effect2.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 && (effect2.f & REACTION_RAN) === 0) { | |
| effect2.b.defer_effect(effect2); | |
| return; | |
| } | |
| var e = effect2; | |
| while (e.parent !== null) { | |
| e = e.parent; | |
| var flags2 = e.f; | |
| if (collected_effects !== null && e === active_effect) { | |
| if ((active_reaction === null || (active_reaction.f & DERIVED) === 0) && true) { | |
| return; | |
| } | |
| } | |
| if ((flags2 & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { | |
| if ((flags2 & CLEAN) === 0) { | |
| return; | |
| } | |
| e.f ^= CLEAN; | |
| } | |
| } | |
| this.#roots.push(e); | |
| } | |
| #link() { | |
| if (last_batch === null) { | |
| first_batch = last_batch = this; | |
| } else { | |
| last_batch.#next = this; | |
| this.#prev = last_batch; | |
| } | |
| last_batch = this; | |
| } | |
| #unlink() { | |
| var prev = this.#prev; | |
| var next2 = this.#next; | |
| if (prev === null) { | |
| first_batch = next2; | |
| } else { | |
| prev.#next = next2; | |
| } | |
| if (next2 === null) { | |
| last_batch = prev; | |
| } else { | |
| next2.#prev = prev; | |
| } | |
| this.linked = false; | |
| } | |
| } | |
| function flushSync(fn) { | |
| var was_flushing_sync = is_flushing_sync; | |
| is_flushing_sync = true; | |
| try { | |
| var result; | |
| if (fn) ; | |
| while (true) { | |
| flush_tasks(); | |
| if (current_batch === null) { | |
| return ( | |
| /** @type {T} */ | |
| result | |
| ); | |
| } | |
| current_batch.flush(); | |
| } | |
| } finally { | |
| is_flushing_sync = was_flushing_sync; | |
| } | |
| } | |
| function infinite_loop_guard() { | |
| try { | |
| effect_update_depth_exceeded(); | |
| } catch (error) { | |
| invoke_error_boundary(error, last_scheduled_effect); | |
| } | |
| } | |
| let eager_block_effects = null; | |
| function flush_queued_effects(effects) { | |
| var length = effects.length; | |
| if (length === 0) return; | |
| var i = 0; | |
| while (i < length) { | |
| var effect2 = effects[i++]; | |
| if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) { | |
| eager_block_effects = /* @__PURE__ */ new Set(); | |
| update_effect(effect2); | |
| if (effect2.deps === null && effect2.first === null && effect2.nodes === null && effect2.teardown === null && effect2.ac === null) { | |
| unlink_effect(effect2); | |
| } | |
| if (eager_block_effects?.size > 0) { | |
| old_values.clear(); | |
| for (const e of eager_block_effects) { | |
| if ((e.f & (DESTROYED | INERT)) !== 0) continue; | |
| const ordered_effects = [e]; | |
| let ancestor = e.parent; | |
| while (ancestor !== null) { | |
| if (eager_block_effects.has(ancestor)) { | |
| eager_block_effects.delete(ancestor); | |
| ordered_effects.push(ancestor); | |
| } | |
| ancestor = ancestor.parent; | |
| } | |
| for (let j = ordered_effects.length - 1; j >= 0; j--) { | |
| const e2 = ordered_effects[j]; | |
| if ((e2.f & (DESTROYED | INERT)) !== 0) continue; | |
| update_effect(e2); | |
| } | |
| } | |
| eager_block_effects.clear(); | |
| } | |
| } | |
| } | |
| eager_block_effects = null; | |
| } | |
| function mark_effects(value, sources, marked, checked) { | |
| if (marked.has(value)) return; | |
| marked.add(value); | |
| if (value.reactions !== null) { | |
| for (const reaction of value.reactions) { | |
| const flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark_effects( | |
| /** @type {Derived} */ | |
| reaction, | |
| sources, | |
| marked, | |
| checked | |
| ); | |
| } else if ((flags2 & (ASYNC | BLOCK_EFFECT)) !== 0 && (flags2 & DIRTY) === 0 && depends_on(reaction, sources, checked)) { | |
| set_signal_status(reaction, DIRTY); | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| function depends_on(reaction, sources, checked) { | |
| const depends = checked.get(reaction); | |
| if (depends !== void 0) return depends; | |
| if (reaction.deps !== null) { | |
| for (const dep of reaction.deps) { | |
| if (includes.call(sources, dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on( | |
| /** @type {Derived} */ | |
| dep, | |
| sources, | |
| checked | |
| )) { | |
| checked.set( | |
| /** @type {Derived} */ | |
| dep, | |
| true | |
| ); | |
| return true; | |
| } | |
| } | |
| } | |
| checked.set(reaction, false); | |
| return false; | |
| } | |
| function schedule_effect(effect2) { | |
| current_batch.schedule(effect2); | |
| } | |
| function reset_branch(effect2, tracked) { | |
| if ((effect2.f & BRANCH_EFFECT) !== 0 && (effect2.f & CLEAN) !== 0) { | |
| return; | |
| } | |
| if ((effect2.f & DIRTY) !== 0) { | |
| tracked.d.push(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| tracked.m.push(effect2); | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_branch(e, tracked); | |
| e = e.next; | |
| } | |
| } | |
| function reset_all(effect2) { | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_all(e); | |
| e = e.next; | |
| } | |
| } | |
| function createSubscriber(start) { | |
| let subscribers = 0; | |
| let version = source(0); | |
| let stop; | |
| return () => { | |
| if (effect_tracking()) { | |
| get(version); | |
| render_effect(() => { | |
| if (subscribers === 0) { | |
| stop = untrack(() => start(() => increment(version))); | |
| } | |
| subscribers += 1; | |
| return () => { | |
| queue_micro_task(() => { | |
| subscribers -= 1; | |
| if (subscribers === 0) { | |
| stop?.(); | |
| stop = void 0; | |
| increment(version); | |
| } | |
| }); | |
| }; | |
| }); | |
| } | |
| }; | |
| } | |
| var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED; | |
| function boundary(node, props, children, transform_error) { | |
| new Boundary(node, props, children, transform_error); | |
| } | |
| class Boundary { | |
| /** @type {Boundary | null} */ | |
| parent; | |
| is_pending = false; | |
| /** | |
| * API-level transformError transform function. Transforms errors before they reach the `failed` snippet. | |
| * Inherited from parent boundary, or defaults to identity. | |
| * @type {(error: unknown) => unknown} | |
| */ | |
| transform_error; | |
| /** @type {TemplateNode} */ | |
| #anchor; | |
| /** @type {TemplateNode | null} */ | |
| #hydrate_open = hydrating ? hydrate_node : null; | |
| /** @type {BoundaryProps} */ | |
| #props; | |
| /** @type {((anchor: Node) => void)} */ | |
| #children; | |
| /** @type {Effect} */ | |
| #effect; | |
| /** @type {Effect | null} */ | |
| #main_effect = null; | |
| /** @type {Effect | null} */ | |
| #pending_effect = null; | |
| /** @type {Effect | null} */ | |
| #failed_effect = null; | |
| /** @type {DocumentFragment | null} */ | |
| #offscreen_fragment = null; | |
| #local_pending_count = 0; | |
| #pending_count = 0; | |
| #pending_count_update_queued = false; | |
| /** @type {Set<Effect>} */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** @type {Set<Effect>} */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A source containing the number of pending async deriveds/expressions. | |
| * Only created if `$effect.pending()` is used inside the boundary, | |
| * otherwise updating the source results in needless `Batch.ensure()` | |
| * calls followed by no-op flushes | |
| * @type {Source<number> | null} | |
| */ | |
| #effect_pending = null; | |
| #effect_pending_subscriber = createSubscriber(() => { | |
| this.#effect_pending = source(this.#local_pending_count); | |
| return () => { | |
| this.#effect_pending = null; | |
| }; | |
| }); | |
| /** | |
| * @param {TemplateNode} node | |
| * @param {BoundaryProps} props | |
| * @param {((anchor: Node) => void)} children | |
| * @param {((error: unknown) => unknown) | undefined} [transform_error] | |
| */ | |
| constructor(node, props, children, transform_error) { | |
| this.#anchor = node; | |
| this.#props = props; | |
| this.#children = (anchor) => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| children(anchor); | |
| }; | |
| this.parent = /** @type {Effect} */ | |
| active_effect.b; | |
| this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e); | |
| this.#effect = block(() => { | |
| if (hydrating) { | |
| const comment2 = ( | |
| /** @type {Comment} */ | |
| this.#hydrate_open | |
| ); | |
| hydrate_next(); | |
| const server_rendered_pending = comment2.data === HYDRATION_START_ELSE; | |
| const server_rendered_failed = comment2.data.startsWith(HYDRATION_START_FAILED); | |
| if (server_rendered_failed) { | |
| const serialized_error = JSON.parse(comment2.data.slice(HYDRATION_START_FAILED.length)); | |
| this.#hydrate_failed_content(serialized_error); | |
| } else if (server_rendered_pending) { | |
| this.#hydrate_pending_content(); | |
| } else { | |
| this.#hydrate_resolved_content(); | |
| } | |
| } else { | |
| this.#render(); | |
| } | |
| }, flags); | |
| if (hydrating) { | |
| this.#anchor = hydrate_node; | |
| } | |
| } | |
| #hydrate_resolved_content() { | |
| try { | |
| this.#main_effect = branch(() => this.#children(this.#anchor)); | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error The deserialized error from the server's hydration comment | |
| */ | |
| #hydrate_failed_content(error) { | |
| const failed = this.#props.failed; | |
| if (!failed) return; | |
| this.#failed_effect = branch(() => { | |
| failed( | |
| this.#anchor, | |
| () => error, | |
| () => () => { | |
| } | |
| ); | |
| }); | |
| } | |
| #hydrate_pending_content() { | |
| const pending = this.#props.pending; | |
| if (!pending) return; | |
| this.is_pending = true; | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| queue_micro_task(() => { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| var anchor = create_text(); | |
| fragment.append(anchor); | |
| this.#main_effect = this.#run(() => { | |
| return branch(() => this.#children(anchor)); | |
| }); | |
| if (this.#pending_count === 0) { | |
| this.#anchor.before(fragment); | |
| this.#offscreen_fragment = null; | |
| pause_effect( | |
| /** @type {Effect} */ | |
| this.#pending_effect, | |
| () => { | |
| this.#pending_effect = null; | |
| } | |
| ); | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| }); | |
| } | |
| #render() { | |
| try { | |
| this.is_pending = this.has_pending_snippet(); | |
| this.#pending_count = 0; | |
| this.#local_pending_count = 0; | |
| this.#main_effect = branch(() => { | |
| this.#children(this.#anchor); | |
| }); | |
| if (this.#pending_count > 0) { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| move_effect(this.#main_effect, fragment); | |
| const pending = ( | |
| /** @type {(anchor: Node) => void} */ | |
| this.#props.pending | |
| ); | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| } else { | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #resolve(batch) { | |
| this.is_pending = false; | |
| batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Defer an effect inside a pending boundary until the boundary resolves | |
| * @param {Effect} effect | |
| */ | |
| defer_effect(effect2) { | |
| defer_effect(effect2, this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Returns `false` if the effect exists inside a boundary whose pending snippet is shown | |
| * @returns {boolean} | |
| */ | |
| is_rendered() { | |
| return !this.is_pending && (!this.parent || this.parent.is_rendered()); | |
| } | |
| has_pending_snippet() { | |
| return !!this.#props.pending; | |
| } | |
| /** | |
| * @template T | |
| * @param {() => T} fn | |
| */ | |
| #run(fn) { | |
| var previous_effect = active_effect; | |
| var previous_reaction = active_reaction; | |
| var previous_ctx = component_context; | |
| set_active_effect(this.#effect); | |
| set_active_reaction(this.#effect); | |
| set_component_context(this.#effect.ctx); | |
| try { | |
| Batch.ensure(); | |
| return fn(); | |
| } catch (e) { | |
| handle_error(e); | |
| return null; | |
| } finally { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_ctx); | |
| } | |
| } | |
| /** | |
| * Updates the pending count associated with the currently visible pending snippet, | |
| * if any, such that we can replace the snippet with content once work is done | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| #update_pending_count(d, batch) { | |
| if (!this.has_pending_snippet()) { | |
| if (this.parent) { | |
| this.parent.#update_pending_count(d, batch); | |
| } | |
| return; | |
| } | |
| this.#pending_count += d; | |
| if (this.#pending_count === 0) { | |
| this.#resolve(batch); | |
| if (this.#pending_effect) { | |
| pause_effect(this.#pending_effect, () => { | |
| this.#pending_effect = null; | |
| }); | |
| } | |
| if (this.#offscreen_fragment) { | |
| this.#anchor.before(this.#offscreen_fragment); | |
| this.#offscreen_fragment = null; | |
| } | |
| } | |
| } | |
| /** | |
| * Update the source that powers `$effect.pending()` inside this boundary, | |
| * and controls when the current `pending` snippet (if any) is removed. | |
| * Do not call from inside the class | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| update_pending_count(d, batch) { | |
| this.#update_pending_count(d, batch); | |
| this.#local_pending_count += d; | |
| if (!this.#effect_pending || this.#pending_count_update_queued) return; | |
| this.#pending_count_update_queued = true; | |
| queue_micro_task(() => { | |
| this.#pending_count_update_queued = false; | |
| if (this.#effect_pending) { | |
| internal_set(this.#effect_pending, this.#local_pending_count); | |
| } | |
| }); | |
| } | |
| get_effect_pending() { | |
| this.#effect_pending_subscriber(); | |
| return get( | |
| /** @type {Source<number>} */ | |
| this.#effect_pending | |
| ); | |
| } | |
| /** @param {unknown} error */ | |
| error(error) { | |
| if (!this.#props.onerror && !this.#props.failed) { | |
| throw error; | |
| } | |
| if (current_batch?.is_fork) { | |
| if (this.#main_effect) current_batch.skip_effect(this.#main_effect); | |
| if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect); | |
| if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect); | |
| current_batch.on_fork_commit(() => { | |
| this.#handle_error(error); | |
| }); | |
| } else { | |
| this.#handle_error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error | |
| */ | |
| #handle_error(error) { | |
| if (this.#main_effect) { | |
| destroy_effect(this.#main_effect); | |
| this.#main_effect = null; | |
| } | |
| if (this.#pending_effect) { | |
| destroy_effect(this.#pending_effect); | |
| this.#pending_effect = null; | |
| } | |
| if (this.#failed_effect) { | |
| destroy_effect(this.#failed_effect); | |
| this.#failed_effect = null; | |
| } | |
| if (hydrating) { | |
| set_hydrate_node( | |
| /** @type {TemplateNode} */ | |
| this.#hydrate_open | |
| ); | |
| next(); | |
| set_hydrate_node(skip_nodes()); | |
| } | |
| var onerror = this.#props.onerror; | |
| let failed = this.#props.failed; | |
| var did_reset = false; | |
| var calling_on_error = false; | |
| const reset2 = () => { | |
| if (did_reset) { | |
| svelte_boundary_reset_noop(); | |
| return; | |
| } | |
| did_reset = true; | |
| if (calling_on_error) { | |
| svelte_boundary_reset_onerror(); | |
| } | |
| if (this.#failed_effect !== null) { | |
| pause_effect(this.#failed_effect, () => { | |
| this.#failed_effect = null; | |
| }); | |
| } | |
| this.#run(() => { | |
| this.#render(); | |
| }); | |
| }; | |
| const handle_error_result = (transformed_error) => { | |
| try { | |
| calling_on_error = true; | |
| onerror?.(transformed_error, reset2); | |
| calling_on_error = false; | |
| } catch (error2) { | |
| invoke_error_boundary(error2, this.#effect && this.#effect.parent); | |
| } | |
| if (failed) { | |
| this.#failed_effect = this.#run(() => { | |
| try { | |
| return branch(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| failed( | |
| this.#anchor, | |
| () => transformed_error, | |
| () => reset2 | |
| ); | |
| }); | |
| } catch (error2) { | |
| invoke_error_boundary( | |
| error2, | |
| /** @type {Effect} */ | |
| this.#effect.parent | |
| ); | |
| return null; | |
| } | |
| }); | |
| } | |
| }; | |
| queue_micro_task(() => { | |
| var result; | |
| try { | |
| result = this.transform_error(error); | |
| } catch (e) { | |
| invoke_error_boundary(e, this.#effect && this.#effect.parent); | |
| return; | |
| } | |
| if (result !== null && typeof result === "object" && typeof /** @type {any} */ | |
| result.then === "function") { | |
| result.then( | |
| handle_error_result, | |
| /** @param {unknown} e */ | |
| (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent) | |
| ); | |
| } else { | |
| handle_error_result(result); | |
| } | |
| }); | |
| } | |
| } | |
| function flatten(blockers, sync, async, fn) { | |
| const d = derived; | |
| var pending = blockers.filter((b) => !b.settled); | |
| if (async.length === 0 && pending.length === 0) { | |
| fn(sync.map(d)); | |
| return; | |
| } | |
| var parent = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var restore = capture(); | |
| var blocker_promise = pending.length === 1 ? pending[0].promise : pending.length > 1 ? Promise.all(pending.map((b) => b.promise)) : null; | |
| function finish(values) { | |
| if ((parent.f & DESTROYED) !== 0) { | |
| return; | |
| } | |
| restore(); | |
| try { | |
| fn(values); | |
| } catch (error) { | |
| invoke_error_boundary(error, parent); | |
| } | |
| unset_context(); | |
| } | |
| var decrement_pending = increment_pending(); | |
| if (async.length === 0) { | |
| blocker_promise.then(() => finish(sync.map(d))).finally(decrement_pending); | |
| return; | |
| } | |
| function run() { | |
| Promise.all(async.map((expression) => /* @__PURE__ */ async_derived(expression))).then((result) => finish([...sync.map(d), ...result])).catch((error) => invoke_error_boundary(error, parent)).finally(decrement_pending); | |
| } | |
| if (blocker_promise) { | |
| blocker_promise.then(() => { | |
| restore(); | |
| run(); | |
| unset_context(); | |
| }); | |
| } else { | |
| run(); | |
| } | |
| } | |
| function capture() { | |
| var previous_effect = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var previous_reaction = active_reaction; | |
| var previous_component_context = component_context; | |
| var previous_batch2 = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| return function restore(activate_batch = true) { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_component_context); | |
| if (activate_batch && (previous_effect.f & DESTROYED) === 0) { | |
| previous_batch2?.activate(); | |
| previous_batch2?.apply(); | |
| } | |
| }; | |
| } | |
| function unset_context(deactivate_batch = true) { | |
| set_active_effect(null); | |
| set_active_reaction(null); | |
| set_component_context(null); | |
| if (deactivate_batch) current_batch?.deactivate(); | |
| } | |
| function increment_pending() { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var boundary2 = ( | |
| /** @type {Boundary} */ | |
| effect2.b | |
| ); | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| var blocking = boundary2.is_rendered(); | |
| boundary2.update_pending_count(1, batch); | |
| batch.increment(blocking, effect2); | |
| return () => { | |
| boundary2.update_pending_count(-1, batch); | |
| batch.decrement(blocking, effect2); | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function derived(fn) { | |
| var flags2 = DERIVED | DIRTY; | |
| if (active_effect !== null) { | |
| active_effect.f |= EFFECT_PRESERVED; | |
| } | |
| const signal = { | |
| ctx: component_context, | |
| deps: null, | |
| effects: null, | |
| equals, | |
| f: flags2, | |
| fn, | |
| reactions: null, | |
| rv: 0, | |
| v: ( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ), | |
| wv: 0, | |
| parent: active_effect, | |
| ac: null | |
| }; | |
| return signal; | |
| } | |
| const OBSOLETE = /* @__PURE__ */ Symbol("obsolete"); | |
| // @__NO_SIDE_EFFECTS__ | |
| function async_derived(fn, label, location2) { | |
| let parent = ( | |
| /** @type {Effect | null} */ | |
| active_effect | |
| ); | |
| if (parent === null) { | |
| async_derived_orphan(); | |
| } | |
| var promise = ( | |
| /** @type {Promise<V>} */ | |
| /** @type {unknown} */ | |
| void 0 | |
| ); | |
| var signal = source( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ); | |
| var should_suspend = !active_reaction; | |
| var deferreds = /* @__PURE__ */ new Set(); | |
| async_effect(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var d = deferred(); | |
| promise = d.promise; | |
| try { | |
| Promise.resolve(fn()).then(d.resolve, (e) => { | |
| if (e !== STALE_REACTION) d.reject(e); | |
| }).finally(unset_context); | |
| } catch (error) { | |
| d.reject(error); | |
| unset_context(); | |
| } | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| if (should_suspend) { | |
| if ((effect2.f & REACTION_RAN) !== 0) { | |
| var decrement_pending = increment_pending(); | |
| } | |
| if ( | |
| /** @type {Boundary} */ | |
| parent.b.is_rendered() | |
| ) { | |
| batch.async_deriveds.get(effect2)?.reject(OBSOLETE); | |
| } else { | |
| for (const d2 of deferreds.values()) { | |
| d2.reject(OBSOLETE); | |
| } | |
| } | |
| deferreds.add(d); | |
| batch.async_deriveds.set(effect2, d); | |
| } | |
| const handler = (value, error = void 0) => { | |
| decrement_pending?.(); | |
| deferreds.delete(d); | |
| if (error === OBSOLETE) return; | |
| batch.activate(); | |
| if (error) { | |
| signal.f |= ERROR_VALUE; | |
| internal_set(signal, error); | |
| } else { | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| signal.f ^= ERROR_VALUE; | |
| } | |
| internal_set(signal, value); | |
| } | |
| batch.deactivate(); | |
| }; | |
| d.promise.then(handler, (e) => handler(null, e || "unknown")); | |
| }); | |
| teardown(() => { | |
| for (const d of deferreds) { | |
| d.reject(OBSOLETE); | |
| } | |
| }); | |
| return new Promise((fulfil) => { | |
| function next2(p) { | |
| function go() { | |
| if (p === promise) { | |
| fulfil(signal); | |
| } else { | |
| next2(promise); | |
| } | |
| } | |
| p.then(go, go); | |
| } | |
| next2(promise); | |
| }); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function user_derived(fn) { | |
| const d = /* @__PURE__ */ derived(fn); | |
| push_reaction_value(d); | |
| return d; | |
| } | |
| function destroy_derived_effects(derived2) { | |
| var effects = derived2.effects; | |
| if (effects !== null) { | |
| derived2.effects = null; | |
| for (var i = 0; i < effects.length; i += 1) { | |
| destroy_effect( | |
| /** @type {Effect} */ | |
| effects[i] | |
| ); | |
| } | |
| } | |
| } | |
| function execute_derived(derived2) { | |
| var value; | |
| var prev_active_effect = active_effect; | |
| var parent = derived2.parent; | |
| if (!is_destroying_effect && parent !== null && derived2.v !== UNINITIALIZED && // if it was never evaluated before, it's guaranteed to fail downstream, so we try to execute instead | |
| (parent.f & (DESTROYED | INERT)) !== 0) { | |
| derived_inert(); | |
| return derived2.v; | |
| } | |
| set_active_effect(parent); | |
| { | |
| try { | |
| derived2.f &= ~WAS_MARKED; | |
| destroy_derived_effects(derived2); | |
| value = update_reaction(derived2); | |
| } finally { | |
| set_active_effect(prev_active_effect); | |
| } | |
| } | |
| return value; | |
| } | |
| function update_derived(derived2) { | |
| var value = execute_derived(derived2); | |
| if (!derived2.equals(value)) { | |
| derived2.wv = increment_write_version(); | |
| if (!current_batch?.is_fork || derived2.deps === null) { | |
| if (current_batch !== null) { | |
| current_batch.capture(derived2, value, true); | |
| previous_batch?.capture(derived2, value, true); | |
| } else { | |
| derived2.v = value; | |
| } | |
| if (derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| return; | |
| } | |
| } | |
| } | |
| if (is_destroying_effect) { | |
| return; | |
| } | |
| if (batch_values !== null) { | |
| if (effect_tracking() || current_batch?.is_fork) { | |
| batch_values.set(derived2, value); | |
| } | |
| } else { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| function freeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown || e.ac) { | |
| e.teardown?.(); | |
| e.ac?.abort(STALE_REACTION); | |
| if (e.fn !== null) e.teardown = noop; | |
| e.ac = null; | |
| remove_reactions(e, 0); | |
| destroy_effect_children(e); | |
| } | |
| } | |
| } | |
| function unfreeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown && e.fn !== null) { | |
| update_effect(e); | |
| } | |
| } | |
| } | |
| let eager_effects = /* @__PURE__ */ new Set(); | |
| const old_values = /* @__PURE__ */ new Map(); | |
| let eager_effects_deferred = false; | |
| function source(v, stack) { | |
| var signal = { | |
| f: 0, | |
| // TODO ideally we could skip this altogether, but it causes type errors | |
| v, | |
| reactions: null, | |
| equals, | |
| rv: 0, | |
| wv: 0 | |
| }; | |
| return signal; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function state(v, stack) { | |
| const s = source(v); | |
| push_reaction_value(s); | |
| return s; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function mutable_source(initial_value, immutable = false, trackable = true) { | |
| const s = source(initial_value); | |
| if (!immutable) { | |
| s.equals = safe_equals; | |
| } | |
| return s; | |
| } | |
| function set(source2, value, should_proxy = false) { | |
| if (active_reaction !== null && // since we are untracking the function inside `$inspect.with` we need to add this check | |
| // to ensure we error if state is set inside an inspect effect | |
| (!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 && (current_sources === null || !includes.call(current_sources, source2))) { | |
| state_unsafe_mutation(); | |
| } | |
| let new_value = should_proxy ? proxy(value) : value; | |
| return internal_set(source2, new_value, legacy_updates); | |
| } | |
| function internal_set(source2, value, updated_during_traversal = null) { | |
| if (!source2.equals(value)) { | |
| old_values.set(source2, is_destroying_effect ? value : source2.v); | |
| var batch = Batch.ensure(); | |
| batch.capture(source2, value); | |
| if ((source2.f & DERIVED) !== 0) { | |
| const derived2 = ( | |
| /** @type {Derived} */ | |
| source2 | |
| ); | |
| if ((source2.f & DIRTY) !== 0) { | |
| execute_derived(derived2); | |
| } | |
| if (batch_values === null) { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| source2.wv = increment_write_version(); | |
| mark_reactions(source2, DIRTY, updated_during_traversal); | |
| if (active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { | |
| if (untracked_writes === null) { | |
| set_untracked_writes([source2]); | |
| } else { | |
| untracked_writes.push(source2); | |
| } | |
| } | |
| if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) { | |
| flush_eager_effects(); | |
| } | |
| } | |
| return value; | |
| } | |
| function flush_eager_effects() { | |
| eager_effects_deferred = false; | |
| for (const effect2 of eager_effects) { | |
| if ((effect2.f & CLEAN) !== 0) { | |
| set_signal_status(effect2, MAYBE_DIRTY); | |
| } | |
| let dirty; | |
| try { | |
| dirty = is_dirty(effect2); | |
| } catch { | |
| dirty = true; | |
| } | |
| if (dirty) { | |
| update_effect(effect2); | |
| } | |
| } | |
| eager_effects.clear(); | |
| } | |
| function increment(source2) { | |
| set(source2, source2.v + 1); | |
| } | |
| function mark_reactions(signal, status, updated_during_traversal) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| var length = reactions.length; | |
| for (var i = 0; i < length; i++) { | |
| var reaction = reactions[i]; | |
| var flags2 = reaction.f; | |
| var not_dirty = (flags2 & DIRTY) === 0; | |
| if (not_dirty) { | |
| set_signal_status(reaction, status); | |
| } | |
| if ((flags2 & EAGER_EFFECT) !== 0) { | |
| eager_effects.add( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } else if ((flags2 & DERIVED) !== 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| batch_values?.delete(derived2); | |
| if ((flags2 & WAS_MARKED) === 0) { | |
| if (flags2 & CONNECTED && (active_effect === null || (active_effect.f & REACTION_IS_UPDATING) === 0)) { | |
| reaction.f |= WAS_MARKED; | |
| } | |
| mark_reactions(derived2, MAYBE_DIRTY, updated_during_traversal); | |
| } | |
| } else if (not_dirty) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if ((flags2 & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) { | |
| eager_block_effects.add(effect2); | |
| } | |
| if (updated_during_traversal !== null) { | |
| updated_during_traversal.push(effect2); | |
| } else { | |
| schedule_effect(effect2); | |
| } | |
| } | |
| } | |
| } | |
| function autofocus(dom, value) { | |
| if (value) { | |
| const body = document.body; | |
| dom.autofocus = true; | |
| queue_micro_task(() => { | |
| if (document.activeElement === body) { | |
| dom.focus(); | |
| } | |
| }); | |
| } | |
| } | |
| let listening_to_form_reset = false; | |
| function add_form_reset_listener() { | |
| if (!listening_to_form_reset) { | |
| listening_to_form_reset = true; | |
| document.addEventListener( | |
| "reset", | |
| (evt) => { | |
| Promise.resolve().then(() => { | |
| if (!evt.defaultPrevented) { | |
| for ( | |
| const e of | |
| /**@type {HTMLFormElement} */ | |
| evt.target.elements | |
| ) { | |
| e[FORM_RESET_HANDLER]?.(); | |
| } | |
| } | |
| }); | |
| }, | |
| // In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation) | |
| { capture: true } | |
| ); | |
| } | |
| } | |
| function without_reactive_context(fn) { | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| return fn(); | |
| } finally { | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| function listen_to_event_and_reset_event(element, event2, handler, on_reset = handler) { | |
| element.addEventListener(event2, () => without_reactive_context(handler)); | |
| const prev = ( | |
| /** @type {any} */ | |
| element[FORM_RESET_HANDLER] | |
| ); | |
| if (prev) { | |
| element[FORM_RESET_HANDLER] = () => { | |
| prev(); | |
| on_reset(true); | |
| }; | |
| } else { | |
| element[FORM_RESET_HANDLER] = () => on_reset(true); | |
| } | |
| add_form_reset_listener(); | |
| } | |
| let is_updating_effect = false; | |
| let is_destroying_effect = false; | |
| function set_is_destroying_effect(value) { | |
| is_destroying_effect = value; | |
| } | |
| let active_reaction = null; | |
| let untracking = false; | |
| function set_active_reaction(reaction) { | |
| active_reaction = reaction; | |
| } | |
| let active_effect = null; | |
| function set_active_effect(effect2) { | |
| active_effect = effect2; | |
| } | |
| let current_sources = null; | |
| function push_reaction_value(value) { | |
| if (active_reaction !== null && true) { | |
| if (current_sources === null) { | |
| current_sources = [value]; | |
| } else { | |
| current_sources.push(value); | |
| } | |
| } | |
| } | |
| let new_deps = null; | |
| let skipped_deps = 0; | |
| let untracked_writes = null; | |
| function set_untracked_writes(value) { | |
| untracked_writes = value; | |
| } | |
| let write_version = 1; | |
| let read_version = 0; | |
| let update_version = read_version; | |
| function set_update_version(value) { | |
| update_version = value; | |
| } | |
| function increment_write_version() { | |
| return ++write_version; | |
| } | |
| function is_dirty(reaction) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DIRTY) !== 0) { | |
| return true; | |
| } | |
| if (flags2 & DERIVED) { | |
| reaction.f &= ~WAS_MARKED; | |
| } | |
| if ((flags2 & MAYBE_DIRTY) !== 0) { | |
| var dependencies = ( | |
| /** @type {Value[]} */ | |
| reaction.deps | |
| ); | |
| var length = dependencies.length; | |
| for (var i = 0; i < length; i++) { | |
| var dependency = dependencies[i]; | |
| if (is_dirty( | |
| /** @type {Derived} */ | |
| dependency | |
| )) { | |
| update_derived( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| } | |
| if (dependency.wv > reaction.wv) { | |
| return true; | |
| } | |
| } | |
| if ((flags2 & CONNECTED) !== 0 && // During time traveling we don't want to reset the status so that | |
| // traversal of the graph in the other batches still happens | |
| batch_values === null) { | |
| set_signal_status(reaction, CLEAN); | |
| } | |
| } | |
| return false; | |
| } | |
| function schedule_possible_effect_self_invalidation(signal, effect2, root2 = true) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| if (current_sources !== null && includes.call(current_sources, signal)) { | |
| return; | |
| } | |
| for (var i = 0; i < reactions.length; i++) { | |
| var reaction = reactions[i]; | |
| if ((reaction.f & DERIVED) !== 0) { | |
| schedule_possible_effect_self_invalidation( | |
| /** @type {Derived} */ | |
| reaction, | |
| effect2, | |
| false | |
| ); | |
| } else if (effect2 === reaction) { | |
| if (root2) { | |
| set_signal_status(reaction, DIRTY); | |
| } else if ((reaction.f & CLEAN) !== 0) { | |
| set_signal_status(reaction, MAYBE_DIRTY); | |
| } | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| function update_reaction(reaction) { | |
| var previous_deps = new_deps; | |
| var previous_skipped_deps = skipped_deps; | |
| var previous_untracked_writes = untracked_writes; | |
| var previous_reaction = active_reaction; | |
| var previous_sources = current_sources; | |
| var previous_component_context = component_context; | |
| var previous_untracking = untracking; | |
| var previous_update_version = update_version; | |
| var flags2 = reaction.f; | |
| new_deps = /** @type {null | Value[]} */ | |
| null; | |
| skipped_deps = 0; | |
| untracked_writes = null; | |
| active_reaction = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; | |
| current_sources = null; | |
| set_component_context(reaction.ctx); | |
| untracking = false; | |
| update_version = ++read_version; | |
| if (reaction.ac !== null) { | |
| without_reactive_context(() => { | |
| reaction.ac.abort(STALE_REACTION); | |
| }); | |
| reaction.ac = null; | |
| } | |
| try { | |
| reaction.f |= REACTION_IS_UPDATING; | |
| var fn = ( | |
| /** @type {Function} */ | |
| reaction.fn | |
| ); | |
| var result = fn(); | |
| reaction.f |= REACTION_RAN; | |
| var deps = reaction.deps; | |
| var is_fork = current_batch?.is_fork; | |
| if (new_deps !== null) { | |
| var i; | |
| if (!is_fork) { | |
| remove_reactions(reaction, skipped_deps); | |
| } | |
| if (deps !== null && skipped_deps > 0) { | |
| deps.length = skipped_deps + new_deps.length; | |
| for (i = 0; i < new_deps.length; i++) { | |
| deps[skipped_deps + i] = new_deps[i]; | |
| } | |
| } else { | |
| reaction.deps = deps = new_deps; | |
| } | |
| if (effect_tracking() && (reaction.f & CONNECTED) !== 0) { | |
| for (i = skipped_deps; i < deps.length; i++) { | |
| (deps[i].reactions ??= []).push(reaction); | |
| } | |
| } | |
| } else if (!is_fork && deps !== null && skipped_deps < deps.length) { | |
| remove_reactions(reaction, skipped_deps); | |
| deps.length = skipped_deps; | |
| } | |
| if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0) { | |
| for (i = 0; i < /** @type {Source[]} */ | |
| untracked_writes.length; i++) { | |
| schedule_possible_effect_self_invalidation( | |
| untracked_writes[i], | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| if (previous_reaction !== null && previous_reaction !== reaction) { | |
| read_version++; | |
| if (previous_reaction.deps !== null) { | |
| for (let i2 = 0; i2 < previous_skipped_deps; i2 += 1) { | |
| previous_reaction.deps[i2].rv = read_version; | |
| } | |
| } | |
| if (previous_deps !== null) { | |
| for (const dep of previous_deps) { | |
| dep.rv = read_version; | |
| } | |
| } | |
| if (untracked_writes !== null) { | |
| if (previous_untracked_writes === null) { | |
| previous_untracked_writes = untracked_writes; | |
| } else { | |
| previous_untracked_writes.push(.../** @type {Source[]} */ | |
| untracked_writes); | |
| } | |
| } | |
| } | |
| if ((reaction.f & ERROR_VALUE) !== 0) { | |
| reaction.f ^= ERROR_VALUE; | |
| } | |
| return result; | |
| } catch (error) { | |
| return handle_error(error); | |
| } finally { | |
| reaction.f ^= REACTION_IS_UPDATING; | |
| new_deps = previous_deps; | |
| skipped_deps = previous_skipped_deps; | |
| untracked_writes = previous_untracked_writes; | |
| active_reaction = previous_reaction; | |
| current_sources = previous_sources; | |
| set_component_context(previous_component_context); | |
| untracking = previous_untracking; | |
| update_version = previous_update_version; | |
| } | |
| } | |
| function remove_reaction(signal, dependency) { | |
| let reactions = dependency.reactions; | |
| if (reactions !== null) { | |
| var index = index_of.call(reactions, signal); | |
| if (index !== -1) { | |
| var new_length = reactions.length - 1; | |
| if (new_length === 0) { | |
| reactions = dependency.reactions = null; | |
| } else { | |
| reactions[index] = reactions[new_length]; | |
| reactions.pop(); | |
| } | |
| } | |
| } | |
| if (reactions === null && (dependency.f & DERIVED) !== 0 && // Destroying a child effect while updating a parent effect can cause a dependency to appear | |
| // to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps` | |
| // allows us to skip the expensive work of disconnecting and immediately reconnecting it | |
| (new_deps === null || !includes.call(new_deps, dependency))) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| if ((derived2.f & CONNECTED) !== 0) { | |
| derived2.f ^= CONNECTED; | |
| derived2.f &= ~WAS_MARKED; | |
| } | |
| if (derived2.v !== UNINITIALIZED) { | |
| update_derived_status(derived2); | |
| } | |
| freeze_derived_effects(derived2); | |
| remove_reactions(derived2, 0); | |
| } | |
| } | |
| function remove_reactions(signal, start_index) { | |
| var dependencies = signal.deps; | |
| if (dependencies === null) return; | |
| for (var i = start_index; i < dependencies.length; i++) { | |
| remove_reaction(signal, dependencies[i]); | |
| } | |
| } | |
| function update_effect(effect2) { | |
| var flags2 = effect2.f; | |
| if ((flags2 & DESTROYED) !== 0) { | |
| return; | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var previous_effect = active_effect; | |
| var was_updating_effect = is_updating_effect; | |
| active_effect = effect2; | |
| is_updating_effect = true; | |
| try { | |
| if ((flags2 & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) { | |
| destroy_block_effect_children(effect2); | |
| } else { | |
| destroy_effect_children(effect2); | |
| } | |
| execute_effect_teardown(effect2); | |
| var teardown2 = update_reaction(effect2); | |
| effect2.teardown = typeof teardown2 === "function" ? teardown2 : null; | |
| effect2.wv = write_version; | |
| var dep; | |
| if (DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) ; | |
| } finally { | |
| is_updating_effect = was_updating_effect; | |
| active_effect = previous_effect; | |
| } | |
| } | |
| async function tick() { | |
| await Promise.resolve(); | |
| flushSync(); | |
| } | |
| function get(signal) { | |
| var flags2 = signal.f; | |
| var is_derived = (flags2 & DERIVED) !== 0; | |
| if (active_reaction !== null && !untracking) { | |
| var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0; | |
| if (!destroyed && (current_sources === null || !includes.call(current_sources, signal))) { | |
| var deps = active_reaction.deps; | |
| if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { | |
| if (signal.rv < read_version) { | |
| signal.rv = read_version; | |
| if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { | |
| skipped_deps++; | |
| } else if (new_deps === null) { | |
| new_deps = [signal]; | |
| } else { | |
| new_deps.push(signal); | |
| } | |
| } | |
| } else { | |
| (active_reaction.deps ??= []).push(signal); | |
| var reactions = signal.reactions; | |
| if (reactions === null) { | |
| signal.reactions = [active_reaction]; | |
| } else if (!includes.call(reactions, active_reaction)) { | |
| reactions.push(active_reaction); | |
| } | |
| } | |
| } | |
| } | |
| if (is_destroying_effect && old_values.has(signal)) { | |
| return old_values.get(signal); | |
| } | |
| if (is_derived) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| signal | |
| ); | |
| if (is_destroying_effect) { | |
| var value = derived2.v; | |
| if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) { | |
| value = execute_derived(derived2); | |
| } | |
| old_values.set(derived2, value); | |
| return value; | |
| } | |
| var should_connect = (derived2.f & CONNECTED) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & CONNECTED) !== 0); | |
| var is_new = (derived2.f & REACTION_RAN) === 0; | |
| if (is_dirty(derived2)) { | |
| if (should_connect) { | |
| derived2.f |= CONNECTED; | |
| } | |
| update_derived(derived2); | |
| } | |
| if (should_connect && !is_new) { | |
| unfreeze_derived_effects(derived2); | |
| reconnect(derived2); | |
| } | |
| } | |
| if (batch_values?.has(signal)) { | |
| return batch_values.get(signal); | |
| } | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| throw signal.v; | |
| } | |
| return signal.v; | |
| } | |
| function reconnect(derived2) { | |
| derived2.f |= CONNECTED; | |
| if (derived2.deps === null) return; | |
| for (const dep of derived2.deps) { | |
| (dep.reactions ??= []).push(derived2); | |
| if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) { | |
| unfreeze_derived_effects( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| reconnect( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| } | |
| } | |
| } | |
| function depends_on_old_values(derived2) { | |
| if (derived2.v === UNINITIALIZED) return true; | |
| if (derived2.deps === null) return false; | |
| for (const dep of derived2.deps) { | |
| if (old_values.has(dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on_old_values( | |
| /** @type {Derived} */ | |
| dep | |
| )) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function validate_effect(rune) { | |
| if (active_effect === null) { | |
| if (active_reaction === null) { | |
| effect_orphan(); | |
| } | |
| effect_in_unowned_derived(); | |
| } | |
| if (is_destroying_effect) { | |
| effect_in_teardown(); | |
| } | |
| } | |
| function push_effect(effect2, parent_effect) { | |
| var parent_last = parent_effect.last; | |
| if (parent_last === null) { | |
| parent_effect.last = parent_effect.first = effect2; | |
| } else { | |
| parent_last.next = effect2; | |
| effect2.prev = parent_last; | |
| parent_effect.last = effect2; | |
| } | |
| } | |
| function create_effect(type, fn) { | |
| var parent = active_effect; | |
| if (parent !== null && (parent.f & INERT) !== 0) { | |
| type |= INERT; | |
| } | |
| var effect2 = { | |
| ctx: component_context, | |
| deps: null, | |
| nodes: null, | |
| f: type | DIRTY | CONNECTED, | |
| first: null, | |
| fn, | |
| last: null, | |
| next: null, | |
| parent, | |
| b: parent && parent.b, | |
| prev: null, | |
| teardown: null, | |
| wv: 0, | |
| ac: null | |
| }; | |
| current_batch?.register_created_effect(effect2); | |
| var e = effect2; | |
| if ((type & EFFECT) !== 0) { | |
| if (collected_effects !== null) { | |
| collected_effects.push(effect2); | |
| } else { | |
| Batch.ensure().schedule(effect2); | |
| } | |
| } else if (fn !== null) { | |
| try { | |
| update_effect(effect2); | |
| } catch (e2) { | |
| destroy_effect(effect2); | |
| throw e2; | |
| } | |
| if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && // either `null`, or a singular child | |
| (e.f & EFFECT_PRESERVED) === 0) { | |
| e = e.first; | |
| if ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) { | |
| e.f |= EFFECT_TRANSPARENT; | |
| } | |
| } | |
| } | |
| if (e !== null) { | |
| e.parent = parent; | |
| if (parent !== null) { | |
| push_effect(e, parent); | |
| } | |
| if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| active_reaction | |
| ); | |
| (derived2.effects ??= []).push(e); | |
| } | |
| } | |
| return effect2; | |
| } | |
| function effect_tracking() { | |
| return active_reaction !== null && !untracking; | |
| } | |
| function teardown(fn) { | |
| const effect2 = create_effect(RENDER_EFFECT, null); | |
| set_signal_status(effect2, CLEAN); | |
| effect2.teardown = fn; | |
| return effect2; | |
| } | |
| function user_effect(fn) { | |
| validate_effect(); | |
| var flags2 = ( | |
| /** @type {Effect} */ | |
| active_effect.f | |
| ); | |
| var defer = !active_reaction && (flags2 & BRANCH_EFFECT) !== 0 && (flags2 & REACTION_RAN) === 0; | |
| if (defer) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| (context.e ??= []).push(fn); | |
| } else { | |
| return create_user_effect(fn); | |
| } | |
| } | |
| function create_user_effect(fn) { | |
| return create_effect(EFFECT | USER_EFFECT, fn); | |
| } | |
| function effect_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return () => { | |
| destroy_effect(effect2); | |
| }; | |
| } | |
| function component_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return (options = {}) => { | |
| return new Promise((fulfil) => { | |
| if (options.outro) { | |
| pause_effect(effect2, () => { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| }); | |
| } else { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| } | |
| }); | |
| }; | |
| } | |
| function effect(fn) { | |
| return create_effect(EFFECT, fn); | |
| } | |
| function async_effect(fn) { | |
| return create_effect(ASYNC | EFFECT_PRESERVED, fn); | |
| } | |
| function render_effect(fn, flags2 = 0) { | |
| return create_effect(RENDER_EFFECT | flags2, fn); | |
| } | |
| function template_effect(fn, sync = [], async = [], blockers = []) { | |
| flatten(blockers, sync, async, (values) => { | |
| create_effect(RENDER_EFFECT, () => fn(...values.map(get))); | |
| }); | |
| } | |
| function block(fn, flags2 = 0) { | |
| var effect2 = create_effect(BLOCK_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function managed(fn, flags2 = 0) { | |
| var effect2 = create_effect(MANAGED_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function branch(fn) { | |
| return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn); | |
| } | |
| function execute_effect_teardown(effect2) { | |
| var teardown2 = effect2.teardown; | |
| if (teardown2 !== null) { | |
| const previously_destroying_effect = is_destroying_effect; | |
| const previous_reaction = active_reaction; | |
| set_is_destroying_effect(true); | |
| set_active_reaction(null); | |
| try { | |
| teardown2.call(null); | |
| } finally { | |
| set_is_destroying_effect(previously_destroying_effect); | |
| set_active_reaction(previous_reaction); | |
| } | |
| } | |
| } | |
| function destroy_effect_children(signal, remove_dom = false) { | |
| var effect2 = signal.first; | |
| signal.first = signal.last = null; | |
| while (effect2 !== null) { | |
| const controller = effect2.ac; | |
| if (controller !== null) { | |
| without_reactive_context(() => { | |
| controller.abort(STALE_REACTION); | |
| }); | |
| } | |
| var next2 = effect2.next; | |
| if ((effect2.f & ROOT_EFFECT) !== 0) { | |
| effect2.parent = null; | |
| } else { | |
| destroy_effect(effect2, remove_dom); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_block_effect_children(signal) { | |
| var effect2 = signal.first; | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if ((effect2.f & BRANCH_EFFECT) === 0) { | |
| destroy_effect(effect2); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_effect(effect2, remove_dom = true) { | |
| var removed = false; | |
| if ((remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes !== null && effect2.nodes.end !== null) { | |
| remove_effect_dom( | |
| effect2.nodes.start, | |
| /** @type {TemplateNode} */ | |
| effect2.nodes.end | |
| ); | |
| removed = true; | |
| } | |
| set_signal_status(effect2, DESTROYING); | |
| destroy_effect_children(effect2, remove_dom && !removed); | |
| remove_reactions(effect2, 0); | |
| var transitions = effect2.nodes && effect2.nodes.t; | |
| if (transitions !== null) { | |
| for (const transition of transitions) { | |
| transition.stop(); | |
| } | |
| } | |
| execute_effect_teardown(effect2); | |
| effect2.f ^= DESTROYING; | |
| effect2.f |= DESTROYED; | |
| var parent = effect2.parent; | |
| if (parent !== null && parent.first !== null) { | |
| unlink_effect(effect2); | |
| } | |
| effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes = effect2.ac = effect2.b = null; | |
| } | |
| function remove_effect_dom(node, end) { | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function unlink_effect(effect2) { | |
| var parent = effect2.parent; | |
| var prev = effect2.prev; | |
| var next2 = effect2.next; | |
| if (prev !== null) prev.next = next2; | |
| if (next2 !== null) next2.prev = prev; | |
| if (parent !== null) { | |
| if (parent.first === effect2) parent.first = next2; | |
| if (parent.last === effect2) parent.last = prev; | |
| } | |
| } | |
| function pause_effect(effect2, callback, destroy = true) { | |
| var transitions = []; | |
| pause_children(effect2, transitions, true); | |
| var fn = () => { | |
| if (destroy) destroy_effect(effect2); | |
| if (callback) callback(); | |
| }; | |
| var remaining = transitions.length; | |
| if (remaining > 0) { | |
| var check = () => --remaining || fn(); | |
| for (var transition of transitions) { | |
| transition.out(check); | |
| } | |
| } else { | |
| fn(); | |
| } | |
| } | |
| function pause_children(effect2, transitions, local) { | |
| if ((effect2.f & INERT) !== 0) return; | |
| effect2.f ^= INERT; | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transitions.push(transition); | |
| } | |
| } | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| if ((child2.f & ROOT_EFFECT) === 0) { | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || // If this is a branch effect without a block effect parent, | |
| // it means the parent block effect was pruned. In that case, | |
| // transparency information was transferred to the branch effect. | |
| (child2.f & BRANCH_EFFECT) !== 0 && (effect2.f & BLOCK_EFFECT) !== 0; | |
| pause_children(child2, transitions, transparent ? local : false); | |
| } | |
| child2 = sibling2; | |
| } | |
| } | |
| function resume_effect(effect2) { | |
| resume_children(effect2, true); | |
| } | |
| function resume_children(effect2, local) { | |
| if ((effect2.f & INERT) === 0) return; | |
| effect2.f ^= INERT; | |
| if ((effect2.f & CLEAN) === 0) { | |
| set_signal_status(effect2, DIRTY); | |
| Batch.ensure().schedule(effect2); | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; | |
| resume_children(child2, transparent ? local : false); | |
| child2 = sibling2; | |
| } | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transition.in(); | |
| } | |
| } | |
| } | |
| } | |
| function move_effect(effect2, fragment) { | |
| if (!effect2.nodes) return; | |
| var node = effect2.nodes.start; | |
| var end = effect2.nodes.end; | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| fragment.append(node); | |
| node = next2; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get$1(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get$1(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get$1(scope.store), name); | |
| } | |
| scope.store.set(get$1(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (official website)", | |
| cancel: "Cancel", | |
| enterCode: "Enter code", | |
| enterCodeAria: "Enter code you hear. Press Space to play audio.", | |
| enterCodeFromImage: "To proceed, please enter the code from the image below.", | |
| error: "Verification failed. Try again later.", | |
| expired: "Verification expired. Try again.", | |
| footer: 'Protected by <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (official website)">ALTCHA</a>', | |
| getAudioChallenge: "Get an audio challenge", | |
| label: "I'm not a robot", | |
| loading: "Loading...", | |
| reload: "Reload", | |
| verify: "Verify", | |
| verificationRequired: "Verification required!", | |
| verified: "Verified", | |
| verifying: "Verifying...", | |
| waitAlert: "Verifying... please wait." | |
| }; | |
| globalThis.$altcha.i18n.set("en", i18n); | |
| const PUBLIC_VERSION = "5"; | |
| if (typeof window !== "undefined") { | |
| ((window.__svelte ??= {}).v ??= /* @__PURE__ */ new Set()).add(PUBLIC_VERSION); | |
| } | |
| const event_symbol = /* @__PURE__ */ Symbol("events"); | |
| const all_registered_events = /* @__PURE__ */ new Set(); | |
| const root_event_handles = /* @__PURE__ */ new Set(); | |
| function create_event(event_name, dom, handler, options = {}) { | |
| function target_handler(event2) { | |
| if (!options.capture) { | |
| handle_event_propagation.call(dom, event2); | |
| } | |
| if (!event2.cancelBubble) { | |
| return without_reactive_context(() => { | |
| return handler?.call(this, event2); | |
| }); | |
| } | |
| } | |
| if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") { | |
| queue_micro_task(() => { | |
| dom.addEventListener(event_name, target_handler, options); | |
| }); | |
| } else { | |
| dom.addEventListener(event_name, target_handler, options); | |
| } | |
| return target_handler; | |
| } | |
| function event(event_name, dom, handler, capture2, passive) { | |
| var options = { capture: capture2, passive }; | |
| var target_handler = create_event(event_name, dom, handler, options); | |
| if (dom === document.body || // @ts-ignore | |
| dom === window || // @ts-ignore | |
| dom === document || // Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed | |
| dom instanceof HTMLMediaElement) { | |
| teardown(() => { | |
| dom.removeEventListener(event_name, target_handler, options); | |
| }); | |
| } | |
| } | |
| function delegated(event_name, element, handler) { | |
| (element[event_symbol] ??= {})[event_name] = handler; | |
| } | |
| function delegate(events) { | |
| for (var i = 0; i < events.length; i++) { | |
| all_registered_events.add(events[i]); | |
| } | |
| for (var fn of root_event_handles) { | |
| fn(events); | |
| } | |
| } | |
| let last_propagated_event = null; | |
| function handle_event_propagation(event2) { | |
| var handler_element = this; | |
| var owner_document = ( | |
| /** @type {Node} */ | |
| handler_element.ownerDocument | |
| ); | |
| var event_name = event2.type; | |
| var path = event2.composedPath?.() || []; | |
| var current_target = ( | |
| /** @type {null | Element} */ | |
| path[0] || event2.target | |
| ); | |
| last_propagated_event = event2; | |
| var path_idx = 0; | |
| var handled_at = last_propagated_event === event2 && event2[event_symbol]; | |
| if (handled_at) { | |
| var at_idx = path.indexOf(handled_at); | |
| if (at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ | |
| window)) { | |
| event2[event_symbol] = handler_element; | |
| return; | |
| } | |
| var handler_idx = path.indexOf(handler_element); | |
| if (handler_idx === -1) { | |
| return; | |
| } | |
| if (at_idx <= handler_idx) { | |
| path_idx = at_idx; | |
| } | |
| } | |
| current_target = /** @type {Element} */ | |
| path[path_idx] || event2.target; | |
| if (current_target === handler_element) return; | |
| define_property(event2, "currentTarget", { | |
| configurable: true, | |
| get() { | |
| return current_target || owner_document; | |
| } | |
| }); | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| var throw_error; | |
| var other_errors = []; | |
| while (current_target !== null) { | |
| var parent_element = current_target.assignedSlot || current_target.parentNode || /** @type {any} */ | |
| current_target.host || null; | |
| try { | |
| var delegated2 = current_target[event_symbol]?.[event_name]; | |
| if (delegated2 != null && (!/** @type {any} */ | |
| current_target.disabled || // DOM could've been updated already by the time this is reached, so we check this as well | |
| // -> the target could not have been disabled because it emits the event in the first place | |
| event2.target === current_target)) { | |
| delegated2.call(current_target, event2); | |
| } | |
| } catch (error) { | |
| if (throw_error) { | |
| other_errors.push(error); | |
| } else { | |
| throw_error = error; | |
| } | |
| } | |
| if (event2.cancelBubble || parent_element === handler_element || parent_element === null) { | |
| break; | |
| } | |
| current_target = parent_element; | |
| } | |
| if (throw_error) { | |
| for (let error of other_errors) { | |
| queueMicrotask(() => { | |
| throw error; | |
| }); | |
| } | |
| throw throw_error; | |
| } | |
| } finally { | |
| event2[event_symbol] = handler_element; | |
| delete event2.currentTarget; | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| const policy = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| globalThis?.window?.trustedTypes && /* @__PURE__ */ globalThis.window.trustedTypes.createPolicy("svelte-trusted-html", { | |
| /** @param {string} html */ | |
| createHTML: (html2) => { | |
| return html2; | |
| } | |
| }) | |
| ); | |
| function create_trusted_html(html2) { | |
| return ( | |
| /** @type {string} */ | |
| policy?.createHTML(html2) ?? html2 | |
| ); | |
| } | |
| function create_fragment_from_html(html2) { | |
| var elem = create_element("template"); | |
| elem.innerHTML = create_trusted_html(html2.replaceAll("<!>", "<!---->")); | |
| return elem.content; | |
| } | |
| function assign_nodes(start, end) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| if (effect2.nodes === null) { | |
| effect2.nodes = { start, end, a: null, t: null }; | |
| } | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_html(content, flags2) { | |
| var is_fragment = (flags2 & TEMPLATE_FRAGMENT) !== 0; | |
| var use_import_node = (flags2 & TEMPLATE_USE_IMPORT_NODE) !== 0; | |
| var node; | |
| var has_start = !content.startsWith("<!>"); | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (node === void 0) { | |
| node = create_fragment_from_html(has_start ? content : "<!>" + content); | |
| if (!is_fragment) node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(node); | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true) | |
| ); | |
| if (is_fragment) { | |
| var start = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(clone) | |
| ); | |
| var end = ( | |
| /** @type {TemplateNode} */ | |
| clone.lastChild | |
| ); | |
| assign_nodes(start, end); | |
| } else { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_namespace(content, flags2, ns = "svg") { | |
| var has_start = !content.startsWith("<!>"); | |
| var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`; | |
| var node; | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (!node) { | |
| var fragment = ( | |
| /** @type {DocumentFragment} */ | |
| create_fragment_from_html(wrapped) | |
| ); | |
| var root2 = ( | |
| /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(fragment) | |
| ); | |
| { | |
| node = /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(root2); | |
| } | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| node.cloneNode(true) | |
| ); | |
| { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_svg(content, flags2) { | |
| return /* @__PURE__ */ from_namespace(content, flags2, "svg"); | |
| } | |
| function text(value = "") { | |
| if (!hydrating) { | |
| var t = create_text(value + ""); | |
| assign_nodes(t, t); | |
| return t; | |
| } | |
| var node = hydrate_node; | |
| if (node.nodeType !== TEXT_NODE) { | |
| node.before(node = create_text()); | |
| set_hydrate_node(node); | |
| } else { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| node | |
| ); | |
| } | |
| assign_nodes(node, node); | |
| return node; | |
| } | |
| function comment() { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| var frag = document.createDocumentFragment(); | |
| var start = document.createComment(""); | |
| var anchor = create_text(); | |
| frag.append(start, anchor); | |
| assign_nodes(start, anchor); | |
| return frag; | |
| } | |
| function append(anchor, dom) { | |
| if (hydrating) { | |
| var effect2 = ( | |
| /** @type {Effect & { nodes: EffectNodes }} */ | |
| active_effect | |
| ); | |
| if ((effect2.f & REACTION_RAN) === 0 || effect2.nodes.end === null) { | |
| effect2.nodes.end = hydrate_node; | |
| } | |
| hydrate_next(); | |
| return; | |
| } | |
| if (anchor === null) { | |
| return; | |
| } | |
| anchor.before( | |
| /** @type {Node} */ | |
| dom | |
| ); | |
| } | |
| function is_capture_event(name) { | |
| return name.endsWith("capture") && name !== "gotpointercapture" && name !== "lostpointercapture"; | |
| } | |
| const DELEGATED_EVENTS = [ | |
| "beforeinput", | |
| "click", | |
| "change", | |
| "dblclick", | |
| "contextmenu", | |
| "focusin", | |
| "focusout", | |
| "input", | |
| "keydown", | |
| "keyup", | |
| "mousedown", | |
| "mousemove", | |
| "mouseout", | |
| "mouseover", | |
| "mouseup", | |
| "pointerdown", | |
| "pointermove", | |
| "pointerout", | |
| "pointerover", | |
| "pointerup", | |
| "touchend", | |
| "touchmove", | |
| "touchstart" | |
| ]; | |
| function can_delegate_event(event_name) { | |
| return DELEGATED_EVENTS.includes(event_name); | |
| } | |
| const ATTRIBUTE_ALIASES = { | |
| // no `class: 'className'` because we handle that separately | |
| formnovalidate: "formNoValidate", | |
| ismap: "isMap", | |
| nomodule: "noModule", | |
| playsinline: "playsInline", | |
| readonly: "readOnly", | |
| defaultvalue: "defaultValue", | |
| defaultchecked: "defaultChecked", | |
| srcobject: "srcObject", | |
| novalidate: "noValidate", | |
| allowfullscreen: "allowFullscreen", | |
| disablepictureinpicture: "disablePictureInPicture", | |
| disableremoteplayback: "disableRemotePlayback" | |
| }; | |
| function normalize_attribute(name) { | |
| name = name.toLowerCase(); | |
| return ATTRIBUTE_ALIASES[name] ?? name; | |
| } | |
| const PASSIVE_EVENTS = ["touchstart", "touchmove"]; | |
| function is_passive_event(name) { | |
| return PASSIVE_EVENTS.includes(name); | |
| } | |
| function set_text(text2, value) { | |
| var str = value == null ? "" : typeof value === "object" ? `${value}` : value; | |
| if (str !== /** @type {any} */ | |
| (text2[TEXT_CACHE] ??= text2.nodeValue)) { | |
| text2[TEXT_CACHE] = str; | |
| text2.nodeValue = `${str}`; | |
| } | |
| } | |
| function mount(component2, options) { | |
| return _mount(component2, options); | |
| } | |
| function hydrate(component2, options) { | |
| init_operations(); | |
| options.intro = options.intro ?? false; | |
| const target = options.target; | |
| const was_hydrating = hydrating; | |
| const previous_hydrate_node = hydrate_node; | |
| try { | |
| var anchor = /* @__PURE__ */ get_first_child(target); | |
| while (anchor && (anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| anchor.data !== HYDRATION_START)) { | |
| anchor = /* @__PURE__ */ get_next_sibling(anchor); | |
| } | |
| if (!anchor) { | |
| throw HYDRATION_ERROR; | |
| } | |
| set_hydrating(true); | |
| set_hydrate_node( | |
| /** @type {Comment} */ | |
| anchor | |
| ); | |
| const instance = _mount(component2, { ...options, anchor }); | |
| set_hydrating(false); | |
| return ( | |
| /** @type {Exports} */ | |
| instance | |
| ); | |
| } catch (error) { | |
| if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) { | |
| throw error; | |
| } | |
| if (error !== HYDRATION_ERROR) { | |
| console.warn("Failed to hydrate: ", error); | |
| } | |
| if (options.recover === false) { | |
| hydration_failed(); | |
| } | |
| init_operations(); | |
| clear_text_content(target); | |
| set_hydrating(false); | |
| return mount(component2, options); | |
| } finally { | |
| set_hydrating(was_hydrating); | |
| set_hydrate_node(previous_hydrate_node); | |
| } | |
| } | |
| const listeners = /* @__PURE__ */ new Map(); | |
| function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) { | |
| init_operations(); | |
| var component2 = void 0; | |
| var unmount2 = component_root(() => { | |
| var anchor_node = anchor ?? target.appendChild(create_text()); | |
| boundary( | |
| /** @type {TemplateNode} */ | |
| anchor_node, | |
| { | |
| pending: () => { | |
| } | |
| }, | |
| (anchor_node2) => { | |
| push({}); | |
| var ctx = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| if (context) ctx.c = context; | |
| if (events) { | |
| props.$$events = events; | |
| } | |
| if (hydrating) { | |
| assign_nodes( | |
| /** @type {TemplateNode} */ | |
| anchor_node2, | |
| null | |
| ); | |
| } | |
| component2 = Component(anchor_node2, props) || {}; | |
| if (hydrating) { | |
| active_effect.nodes.end = hydrate_node; | |
| if (hydrate_node === null || hydrate_node.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| hydrate_node.data !== HYDRATION_END) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| } | |
| pop(); | |
| }, | |
| transformError | |
| ); | |
| var registered_events = /* @__PURE__ */ new Set(); | |
| var event_handle = (events2) => { | |
| for (var i = 0; i < events2.length; i++) { | |
| var event_name = events2[i]; | |
| if (registered_events.has(event_name)) continue; | |
| registered_events.add(event_name); | |
| var passive = is_passive_event(event_name); | |
| for (const node of [target, document]) { | |
| var counts = listeners.get(node); | |
| if (counts === void 0) { | |
| counts = /* @__PURE__ */ new Map(); | |
| listeners.set(node, counts); | |
| } | |
| var count = counts.get(event_name); | |
| if (count === void 0) { | |
| node.addEventListener(event_name, handle_event_propagation, { passive }); | |
| counts.set(event_name, 1); | |
| } else { | |
| counts.set(event_name, count + 1); | |
| } | |
| } | |
| } | |
| }; | |
| event_handle(array_from(all_registered_events)); | |
| root_event_handles.add(event_handle); | |
| return () => { | |
| for (var event_name of registered_events) { | |
| for (const node of [target, document]) { | |
| var counts = ( | |
| /** @type {Map<string, number>} */ | |
| listeners.get(node) | |
| ); | |
| var count = ( | |
| /** @type {number} */ | |
| counts.get(event_name) | |
| ); | |
| if (--count == 0) { | |
| node.removeEventListener(event_name, handle_event_propagation); | |
| counts.delete(event_name); | |
| if (counts.size === 0) { | |
| listeners.delete(node); | |
| } | |
| } else { | |
| counts.set(event_name, count); | |
| } | |
| } | |
| } | |
| root_event_handles.delete(event_handle); | |
| if (anchor_node !== anchor) { | |
| anchor_node.parentNode?.removeChild(anchor_node); | |
| } | |
| }; | |
| }); | |
| mounted_components.set(component2, unmount2); | |
| return component2; | |
| } | |
| let mounted_components = /* @__PURE__ */ new WeakMap(); | |
| function unmount(component2, options) { | |
| const fn = mounted_components.get(component2); | |
| if (fn) { | |
| mounted_components.delete(component2); | |
| return fn(options); | |
| } | |
| return Promise.resolve(); | |
| } | |
| class BranchManager { | |
| /** @type {TemplateNode} */ | |
| anchor; | |
| /** @type {Map<Batch, Key>} */ | |
| #batches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Map of keys to effects that are currently rendered in the DOM. | |
| * These effects are visible and actively part of the document tree. | |
| * Example: | |
| * |
변경 전i18n.js
변경 후i18n.js
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
변경 전gd_board_goods.js
| } | |
| } | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| } | |
| } | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
변경 후gd_board_goods.js
| } | |
| } | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function loadAltchaModule() { | |
| if (window.gdAltchaModuleLoaded) { | |
| return; | |
| } | |
| const wrap = document.querySelector('.capcha_altcha[data-altcha-src]'); | |
| if (!wrap) { | |
| return; | |
| } | |
| window.gdAltchaModuleLoaded = true; | |
| const src = wrap.getAttribute('data-altcha-src'); | |
| [src, src.replace('altcha.js', 'i18n.js')].forEach(function (url) { | |
| const script = document.createElement('script'); | |
| script.type = 'module'; | |
| script.src = url; | |
| document.head.appendChild(script); | |
| }); | |
| } | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| loadAltchaModule(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| } | |
| } | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function loadAltchaModule() { | |
| if (window.gdAltchaModuleLoaded) { | |
| return; | |
| } | |
| const wrap = document.querySelector('.capcha_altcha[data-altcha-src]'); | |
| if (!wrap) { | |
| return; | |
| } | |
| window.gdAltchaModuleLoaded = true; | |
| const src = wrap.getAttribute('data-altcha-src'); | |
| [src, src.replace('altcha.js', 'i18n.js')].forEach(function (url) { | |
| const script = document.createElement('script'); | |
| script.type = 'module'; | |
| script.src = url; | |
| document.head.appendChild(script); | |
| }); | |
| } | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| loadAltchaModule(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
변경 전gd_board_view.js
| return true; | |
| } | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| } | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 후gd_board_view.js
| return true; | |
| } | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| } | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| /** | |
| * 댓글작성 | |
| */ | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 전gd_board_write.js
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $.validator.addMethod("checkCaptcha", function (value, element, fl) { | |
| var success = false; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'captcha', 'captchaKey': value }, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| if (result == 'true') { | |
| success = true; | |
| } | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| return success; | |
| }, __("자동등록방지 문자가 틀렸습니다.")); | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: { | |
| required: true, | |
| checkCaptcha : true, | |
| }, | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $.validator.addMethod("checkCaptcha", function (value, element, fl) { | |
| var success = false; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'captcha', 'captchaKey': value }, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| if (result == 'true') { | |
| success = true; | |
| } | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| return success; | |
| }, __("자동등록방지 문자가 틀렸습니다.")); | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: { | |
| required: true, | |
| checkCaptcha : true, | |
| }, | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
변경 후gd_board_write.js
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
변경 전gd_common.js
| /** | |
| * 프레임 리사이즈 | |
| */ | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = (obj).contentWindow.document.body.clientHeight; | |
| (obj).height = iframeHeight + 80; | |
변경 후gd_common.js
| /** | |
| * 프레임 리사이즈 | |
| */ | |
| /* iframe(mypage 등)으로 board 목록이 실릴 때, onload 1회 측정(resize_frame/gd_resize_frame) 이후에도 | |
| 댓글/답글 폼 토글, ALTCHA 위젯 지연 렌더, 댓글 등록/삭제 등으로 내용 높이가 바뀌면 | |
| 부모 iframe 높이를 다시 맞춘다. body 높이가 실제로 변했을 때만 호출해 재측정 루프를 방지. */ | |
| (function () { | |
| let parentResize; | |
| try { | |
| if (window.parent === window) { | |
| return; // 최상위 문서 → 대상 아님 | |
| } | |
| parentResize = window.parent.gd_resize_frame || window.parent.resize_frame; | |
| } catch (e) { | |
| return; // cross-origin 부모 → 접근 불가, 대상 아님 | |
| } | |
| if (typeof parentResize !== 'function' || typeof window.ResizeObserver === 'undefined') { | |
| return; | |
| } | |
| const startObserve = function () { | |
| const frameEl = window.frameElement | |
| || (window.name ? window.parent.document.getElementsByName(window.name)[0] : null); | |
| if (!frameEl || !document.body) { | |
| return; | |
| } | |
| let timer = null; | |
| let lastHeight = -1; | |
| const observer = new ResizeObserver(function () { | |
| if (timer) { | |
| clearTimeout(timer); | |
| } | |
| timer = setTimeout(function () { | |
| const height = document.body.clientHeight; | |
| if (height === lastHeight) { | |
| return; // 실제 콘텐츠 높이 변화 없음 → 재측정 루프 방지 | |
| } | |
| lastHeight = height; | |
| parentResize.call(window.parent, frameEl); | |
| }, 100); | |
| }); | |
| observer.observe(document.body); | |
| }; | |
| if (document.body) { | |
| startObserve(); | |
| } else { | |
| document.addEventListener('DOMContentLoaded', startObserve); | |
| } | |
| })(); | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = (obj).contentWindow.document.body.clientHeight; | |
| (obj).height = iframeHeight + 80; | |
변경 전gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
변경 후gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
변경 전join.html
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
변경 후join.html
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
변경 전_join_view_captcha.html
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" id="reload_captcha"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" id="reload_captcha"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
변경 후_join_view_captcha.html
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </td> | |
| </tr> | |
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </td> | |
| </tr> | |
변경 전_altcha.html
변경 후_altcha.html
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Front\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼(goods_board_write)에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Front\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼(goods_board_write)에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
변경 전popup_goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
변경 후popup_goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y' }--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
변경 전view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| <!-- //layer_wrap --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="img/icon/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 후write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| gd_select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file_upload_sec"> | |
| <label for="attach<%=idx%>"> | |
변경 전goods_board_review_view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha" style="margin-top: 10px;"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha" style="margin-top: 10px;"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha" style="margin-top: 10px;"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| <div class="capcha" style="margin-top: 10px;"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_reply_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
변경 후goods_board_review_view.html
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!-- //board_comment_write --> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
변경 전goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" onclick="gd_reload_captcha()"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}" class="va-m"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
변경 후goods_board_write.html
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php', 'altchaSrc', 'y')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| <tr> | |
| <th scope="row">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php', 'altchaSrc', 'y')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
변경 전goods_view.html
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
변경 후goods_view.html
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
| <!--//플러스리뷰 레이어 --><div id="writePop" class="layer_wrap plus_review_edit_layer dn"></div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
변경 전altcha.js
변경 후altcha.js
| const DEV = false; | |
| var is_array = Array.isArray; | |
| var index_of = Array.prototype.indexOf; | |
| var includes = Array.prototype.includes; | |
| var array_from = Array.from; | |
| var object_keys = Object.keys; | |
| var define_property = Object.defineProperty; | |
| var get_descriptor = Object.getOwnPropertyDescriptor; | |
| var get_descriptors = Object.getOwnPropertyDescriptors; | |
| var object_prototype = Object.prototype; | |
| var array_prototype = Array.prototype; | |
| var get_prototype_of = Object.getPrototypeOf; | |
| var is_extensible = Object.isExtensible; | |
| const noop = () => { | |
| }; | |
| function run_all(arr) { | |
| for (var i = 0; i < arr.length; i++) { | |
| arr[i](); | |
| } | |
| } | |
| function deferred() { | |
| var resolve; | |
| var reject; | |
| var promise = new Promise((res, rej) => { | |
| resolve = res; | |
| reject = rej; | |
| }); | |
| return { promise, resolve, reject }; | |
| } | |
| const DERIVED = 1 << 1; | |
| const EFFECT = 1 << 2; | |
| const RENDER_EFFECT = 1 << 3; | |
| const MANAGED_EFFECT = 1 << 24; | |
| const BLOCK_EFFECT = 1 << 4; | |
| const BRANCH_EFFECT = 1 << 5; | |
| const ROOT_EFFECT = 1 << 6; | |
| const BOUNDARY_EFFECT = 1 << 7; | |
| const CONNECTED = 1 << 9; | |
| const CLEAN = 1 << 10; | |
| const DIRTY = 1 << 11; | |
| const MAYBE_DIRTY = 1 << 12; | |
| const INERT = 1 << 13; | |
| const DESTROYED = 1 << 14; | |
| const REACTION_RAN = 1 << 15; | |
| const DESTROYING = 1 << 25; | |
| const EFFECT_TRANSPARENT = 1 << 16; | |
| const EAGER_EFFECT = 1 << 17; | |
| const HEAD_EFFECT = 1 << 18; | |
| const EFFECT_PRESERVED = 1 << 19; | |
| const USER_EFFECT = 1 << 20; | |
| const WAS_MARKED = 1 << 16; | |
| const REACTION_IS_UPDATING = 1 << 21; | |
| const ASYNC = 1 << 22; | |
| const ERROR_VALUE = 1 << 23; | |
| const STATE_SYMBOL = /* @__PURE__ */ Symbol("$state"); | |
| const LEGACY_PROPS = /* @__PURE__ */ Symbol("legacy props"); | |
| const LOADING_ATTR_SYMBOL = /* @__PURE__ */ Symbol(""); | |
| const ATTRIBUTES_CACHE = /* @__PURE__ */ Symbol("attributes"); | |
| const CLASS_CACHE = /* @__PURE__ */ Symbol("class"); | |
| const STYLE_CACHE = /* @__PURE__ */ Symbol("style"); | |
| const TEXT_CACHE = /* @__PURE__ */ Symbol("text"); | |
| const FORM_RESET_HANDLER = /* @__PURE__ */ Symbol("form reset"); | |
| const STALE_REACTION = new class StaleReactionError extends Error { | |
| name = "StaleReactionError"; | |
| message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; | |
| }(); | |
| const IS_XHTML = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| !!globalThis.document?.contentType && /* @__PURE__ */ globalThis.document.contentType.includes("xml") | |
| ); | |
| const TEXT_NODE = 3; | |
| const COMMENT_NODE = 8; | |
| function equals(value) { | |
| return value === this.v; | |
| } | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function safe_equals(value) { | |
| return !safe_not_equal(value, this.v); | |
| } | |
| function lifecycle_outside_component(name) { | |
| { | |
| throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); | |
| } | |
| } | |
| function async_derived_orphan() { | |
| { | |
| throw new Error(`https://svelte.dev/e/async_derived_orphan`); | |
| } | |
| } | |
| function effect_in_teardown(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_teardown`); | |
| } | |
| } | |
| function effect_in_unowned_derived() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); | |
| } | |
| } | |
| function effect_orphan(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_orphan`); | |
| } | |
| } | |
| function effect_update_depth_exceeded() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); | |
| } | |
| } | |
| function hydration_failed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/hydration_failed`); | |
| } | |
| } | |
| function state_descriptors_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); | |
| } | |
| } | |
| function state_prototype_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_prototype_fixed`); | |
| } | |
| } | |
| function state_unsafe_mutation() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); | |
| } | |
| } | |
| function svelte_boundary_reset_onerror() { | |
| { | |
| throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); | |
| } | |
| } | |
| let tracing_mode_flag = false; | |
| const TEMPLATE_FRAGMENT = 1; | |
| const TEMPLATE_USE_IMPORT_NODE = 1 << 1; | |
| const HYDRATION_START = "["; | |
| const HYDRATION_START_ELSE = "[!"; | |
| const HYDRATION_START_FAILED = "[?"; | |
| const HYDRATION_END = "]"; | |
| const HYDRATION_ERROR = {}; | |
| const UNINITIALIZED = /* @__PURE__ */ Symbol("uninitialized"); | |
| const NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; | |
| const NAMESPACE_SVG = "http://www.w3.org/2000/svg"; | |
| const NAMESPACE_MATHML = "http://www.w3.org/1998/Math/MathML"; | |
| const ATTACHMENT_KEY = "@attach"; | |
| let component_context = null; | |
| function set_component_context(context) { | |
| component_context = context; | |
| } | |
| function push(props, runes = false, fn) { | |
| component_context = { | |
| p: component_context, | |
| i: false, | |
| c: null, | |
| e: null, | |
| s: props, | |
| x: null, | |
| r: ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ), | |
| l: null | |
| }; | |
| } | |
| function pop(component2) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| var effects = context.e; | |
| if (effects !== null) { | |
| context.e = null; | |
| for (var fn of effects) { | |
| create_user_effect(fn); | |
| } | |
| } | |
| if (component2 !== void 0) { | |
| context.x = component2; | |
| } | |
| context.i = true; | |
| component_context = context.p; | |
| return component2 ?? /** @type {T} */ | |
| {}; | |
| } | |
| function is_runes() { | |
| return true; | |
| } | |
| let micro_tasks = []; | |
| function run_micro_tasks() { | |
| var tasks = micro_tasks; | |
| micro_tasks = []; | |
| run_all(tasks); | |
| } | |
| function queue_micro_task(fn) { | |
| if (micro_tasks.length === 0 && !is_flushing_sync) { | |
| var tasks = micro_tasks; | |
| queueMicrotask(() => { | |
| if (tasks === micro_tasks) run_micro_tasks(); | |
| }); | |
| } | |
| micro_tasks.push(fn); | |
| } | |
| function flush_tasks() { | |
| while (micro_tasks.length > 0) { | |
| run_micro_tasks(); | |
| } | |
| } | |
| function derived_inert() { | |
| { | |
| console.warn(`https://svelte.dev/e/derived_inert`); | |
| } | |
| } | |
| function hydration_mismatch(location2) { | |
| { | |
| console.warn(`https://svelte.dev/e/hydration_mismatch`); | |
| } | |
| } | |
| function select_multiple_invalid_value() { | |
| { | |
| console.warn(`https://svelte.dev/e/select_multiple_invalid_value`); | |
| } | |
| } | |
| function svelte_boundary_reset_noop() { | |
| { | |
| console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`); | |
| } | |
| } | |
| let hydrating = false; | |
| function set_hydrating(value) { | |
| hydrating = value; | |
| } | |
| let hydrate_node; | |
| function set_hydrate_node(node) { | |
| if (node === null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return hydrate_node = node; | |
| } | |
| function hydrate_next() { | |
| return set_hydrate_node(/* @__PURE__ */ get_next_sibling(hydrate_node)); | |
| } | |
| function reset(node) { | |
| if (!hydrating) return; | |
| if (/* @__PURE__ */ get_next_sibling(hydrate_node) !== null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| hydrate_node = node; | |
| } | |
| function next(count = 1) { | |
| if (hydrating) { | |
| var i = count; | |
| var node = hydrate_node; | |
| while (i--) { | |
| node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node); | |
| } | |
| hydrate_node = node; | |
| } | |
| } | |
| function skip_nodes(remove = true) { | |
| var depth = 0; | |
| var node = hydrate_node; | |
| while (true) { | |
| if (node.nodeType === COMMENT_NODE) { | |
| var data = ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| if (data === HYDRATION_END) { | |
| if (depth === 0) return node; | |
| depth -= 1; | |
| } else if (data === HYDRATION_START || data === HYDRATION_START_ELSE || // "[1", "[2", etc. for if blocks | |
| data[0] === "[" && !isNaN(Number(data.slice(1)))) { | |
| depth += 1; | |
| } | |
| } | |
| var next2 = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node) | |
| ); | |
| if (remove) node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function read_hydration_instruction(node) { | |
| if (!node || node.nodeType !== COMMENT_NODE) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| } | |
| function proxy(value) { | |
| if (typeof value !== "object" || value === null || STATE_SYMBOL in value) { | |
| return value; | |
| } | |
| const prototype = get_prototype_of(value); | |
| if (prototype !== object_prototype && prototype !== array_prototype) { | |
| return value; | |
| } | |
| var sources = /* @__PURE__ */ new Map(); | |
| var is_proxied_array = is_array(value); | |
| var version = /* @__PURE__ */ state(0); | |
| var parent_version = update_version; | |
| var with_parent = (fn) => { | |
| if (update_version === parent_version) { | |
| return fn(); | |
| } | |
| var reaction = active_reaction; | |
| var version2 = update_version; | |
| set_active_reaction(null); | |
| set_update_version(parent_version); | |
| var result = fn(); | |
| set_active_reaction(reaction); | |
| set_update_version(version2); | |
| return result; | |
| }; | |
| if (is_proxied_array) { | |
| sources.set("length", /* @__PURE__ */ state( | |
| /** @type {any[]} */ | |
| value.length | |
| )); | |
| } | |
| return new Proxy( | |
| /** @type {any} */ | |
| value, | |
| { | |
| defineProperty(_, prop2, descriptor) { | |
| if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) { | |
| state_descriptors_fixed(); | |
| } | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| with_parent(() => { | |
| var s2 = /* @__PURE__ */ state(descriptor.value); | |
| sources.set(prop2, s2); | |
| return s2; | |
| }); | |
| } else { | |
| set(s, descriptor.value, true); | |
| } | |
| return true; | |
| }, | |
| deleteProperty(target, prop2) { | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| if (prop2 in target) { | |
| const s2 = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(prop2, s2); | |
| increment(version); | |
| } | |
| } else { | |
| set(s, UNINITIALIZED); | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| get(target, prop2, receiver) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return value; | |
| } | |
| var s = sources.get(prop2); | |
| var exists = prop2 in target; | |
| if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) { | |
| s = with_parent(() => { | |
| var p = proxy(exists ? target[prop2] : UNINITIALIZED); | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| if (s !== void 0) { | |
| var v = get(s); | |
| return v === UNINITIALIZED ? void 0 : v; | |
| } | |
| return Reflect.get(target, prop2, receiver); | |
| }, | |
| getOwnPropertyDescriptor(target, prop2) { | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor && "value" in descriptor) { | |
| var s = sources.get(prop2); | |
| if (s) descriptor.value = get(s); | |
| } else if (descriptor === void 0) { | |
| var source2 = sources.get(prop2); | |
| var value2 = source2?.v; | |
| if (source2 !== void 0 && value2 !== UNINITIALIZED) { | |
| return { | |
| enumerable: true, | |
| configurable: true, | |
| value: value2, | |
| writable: true | |
| }; | |
| } | |
| } | |
| return descriptor; | |
| }, | |
| has(target, prop2) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return true; | |
| } | |
| var s = sources.get(prop2); | |
| var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2); | |
| if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) { | |
| if (s === void 0) { | |
| s = with_parent(() => { | |
| var p = has ? proxy(target[prop2]) : UNINITIALIZED; | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| var value2 = get(s); | |
| if (value2 === UNINITIALIZED) { | |
| return false; | |
| } | |
| } | |
| return has; | |
| }, | |
| set(target, prop2, value2, receiver) { | |
| var s = sources.get(prop2); | |
| var has = prop2 in target; | |
| if (is_proxied_array && prop2 === "length") { | |
| for (var i = value2; i < /** @type {Source<number>} */ | |
| s.v; i += 1) { | |
| var other_s = sources.get(i + ""); | |
| if (other_s !== void 0) { | |
| set(other_s, UNINITIALIZED); | |
| } else if (i in target) { | |
| other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(i + "", other_s); | |
| } | |
| } | |
| } | |
| if (s === void 0) { | |
| if (!has || get_descriptor(target, prop2)?.writable) { | |
| s = with_parent(() => /* @__PURE__ */ state(void 0)); | |
| set(s, proxy(value2)); | |
| sources.set(prop2, s); | |
| } | |
| } else { | |
| has = s.v !== UNINITIALIZED; | |
| var p = with_parent(() => proxy(value2)); | |
| set(s, p); | |
| } | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor?.set) { | |
| descriptor.set.call(receiver, value2); | |
| } | |
| if (!has) { | |
| if (is_proxied_array && typeof prop2 === "string") { | |
| var ls = ( | |
| /** @type {Source<number>} */ | |
| sources.get("length") | |
| ); | |
| var n = Number(prop2); | |
| if (Number.isInteger(n) && n >= ls.v) { | |
| set(ls, n + 1); | |
| } | |
| } | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| ownKeys(target) { | |
| get(version); | |
| var own_keys = Reflect.ownKeys(target).filter((key3) => { | |
| var source3 = sources.get(key3); | |
| return source3 === void 0 || source3.v !== UNINITIALIZED; | |
| }); | |
| for (var [key2, source2] of sources) { | |
| if (source2.v !== UNINITIALIZED && !(key2 in target)) { | |
| own_keys.push(key2); | |
| } | |
| } | |
| return own_keys; | |
| }, | |
| setPrototypeOf() { | |
| state_prototype_fixed(); | |
| } | |
| } | |
| ); | |
| } | |
| function get_proxied_value(value) { | |
| try { | |
| if (value !== null && typeof value === "object" && STATE_SYMBOL in value) { | |
| return value[STATE_SYMBOL]; | |
| } | |
| } catch { | |
| } | |
| return value; | |
| } | |
| function is(a, b) { | |
| return Object.is(get_proxied_value(a), get_proxied_value(b)); | |
| } | |
| var $window; | |
| var $document; | |
| var is_firefox; | |
| var first_child_getter; | |
| var next_sibling_getter; | |
| function init_operations() { | |
| if ($window !== void 0) { | |
| return; | |
| } | |
| $window = window; | |
| $document = document; | |
| is_firefox = /Firefox/.test(navigator.userAgent); | |
| var element_prototype = Element.prototype; | |
| var node_prototype = Node.prototype; | |
| var text_prototype = Text.prototype; | |
| first_child_getter = get_descriptor(node_prototype, "firstChild").get; | |
| next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; | |
| if (is_extensible(element_prototype)) { | |
| element_prototype[CLASS_CACHE] = void 0; | |
| element_prototype[ATTRIBUTES_CACHE] = null; | |
| element_prototype[STYLE_CACHE] = void 0; | |
| element_prototype.__e = void 0; | |
| } | |
| if (is_extensible(text_prototype)) { | |
| text_prototype[TEXT_CACHE] = void 0; | |
| } | |
| } | |
| function create_text(value = "") { | |
| return document.createTextNode(value); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_first_child(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| first_child_getter.call(node) | |
| ); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_next_sibling(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| next_sibling_getter.call(node) | |
| ); | |
| } | |
| function child(node, is_text) { | |
| if (!hydrating) { | |
| return /* @__PURE__ */ get_first_child(node); | |
| } | |
| var child2 = /* @__PURE__ */ get_first_child(hydrate_node); | |
| if (child2 === null) { | |
| child2 = hydrate_node.appendChild(create_text()); | |
| } else if (is_text && child2.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| child2?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| if (is_text) { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| child2 | |
| ); | |
| } | |
| set_hydrate_node(child2); | |
| return child2; | |
| } | |
| function first_child(node, is_text = false) { | |
| if (!hydrating) { | |
| var first = /* @__PURE__ */ get_first_child(node); | |
| if (first instanceof Comment && first.data === "") return /* @__PURE__ */ get_next_sibling(first); | |
| return first; | |
| } | |
| if (is_text) { | |
| if (hydrate_node?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| hydrate_node?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| hydrate_node | |
| ); | |
| } | |
| return hydrate_node; | |
| } | |
| function sibling(node, count = 1, is_text = false) { | |
| let next_sibling = hydrating ? hydrate_node : node; | |
| var last_sibling; | |
| while (count--) { | |
| last_sibling = next_sibling; | |
| next_sibling = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(next_sibling); | |
| } | |
| if (!hydrating) { | |
| return next_sibling; | |
| } | |
| if (is_text) { | |
| if (next_sibling?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| if (next_sibling === null) { | |
| last_sibling?.after(text2); | |
| } else { | |
| next_sibling.before(text2); | |
| } | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| next_sibling | |
| ); | |
| } | |
| set_hydrate_node(next_sibling); | |
| return next_sibling; | |
| } | |
| function clear_text_content(node) { | |
| node.textContent = ""; | |
| } | |
| function should_defer_append() { | |
| return false; | |
| } | |
| function create_element(tag, namespace, is2) { | |
| let options = void 0; | |
| return ( | |
| /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ | |
| document.createElementNS(namespace ?? NAMESPACE_HTML, tag, options) | |
| ); | |
| } | |
| function merge_text_nodes(text2) { | |
| if ( | |
| /** @type {string} */ | |
| text2.nodeValue.length < 65536 | |
| ) { | |
| return; | |
| } | |
| let next2 = text2.nextSibling; | |
| while (next2 !== null && next2.nodeType === TEXT_NODE) { | |
| next2.remove(); | |
| text2.nodeValue += /** @type {string} */ | |
| next2.nodeValue; | |
| next2 = text2.nextSibling; | |
| } | |
| } | |
| function handle_error(error) { | |
| var effect2 = active_effect; | |
| if (effect2 === null) { | |
| active_reaction.f |= ERROR_VALUE; | |
| return error; | |
| } | |
| if ((effect2.f & REACTION_RAN) === 0 && (effect2.f & EFFECT) === 0) { | |
| throw error; | |
| } | |
| invoke_error_boundary(error, effect2); | |
| } | |
| function invoke_error_boundary(error, effect2) { | |
| while (effect2 !== null) { | |
| if ((effect2.f & BOUNDARY_EFFECT) !== 0) { | |
| if ((effect2.f & REACTION_RAN) === 0) { | |
| throw error; | |
| } | |
| try { | |
| effect2.b.error(error); | |
| return; | |
| } catch (e) { | |
| error = e; | |
| } | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| throw error; | |
| } | |
| const STATUS_MASK = -7169; | |
| function set_signal_status(signal, status) { | |
| signal.f = signal.f & STATUS_MASK | status; | |
| } | |
| function update_derived_status(derived2) { | |
| if ((derived2.f & CONNECTED) !== 0 || derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| } else { | |
| set_signal_status(derived2, MAYBE_DIRTY); | |
| } | |
| } | |
| function clear_marked(deps) { | |
| if (deps === null) return; | |
| for (const dep of deps) { | |
| if ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) { | |
| continue; | |
| } | |
| dep.f ^= WAS_MARKED; | |
| clear_marked( | |
| /** @type {Derived} */ | |
| dep.deps | |
| ); | |
| } | |
| } | |
| function defer_effect(effect2, dirty_effects, maybe_dirty_effects) { | |
| if ((effect2.f & DIRTY) !== 0) { | |
| dirty_effects.add(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| maybe_dirty_effects.add(effect2); | |
| } | |
| clear_marked(effect2.deps); | |
| set_signal_status(effect2, CLEAN); | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set2(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set2(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set2, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set: set2, update, subscribe }; | |
| } | |
| function get$1(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let IS_UNMOUNTED = /* @__PURE__ */ Symbol("unmounted"); | |
| function store_get(store2, store_name, stores) { | |
| const entry = stores[store_name] ??= { | |
| store: null, | |
| source: /* @__PURE__ */ mutable_source(void 0), | |
| unsubscribe: noop | |
| }; | |
| if (entry.store !== store2 && !(IS_UNMOUNTED in stores)) { | |
| entry.unsubscribe(); | |
| entry.store = store2 ?? null; | |
| if (store2 == null) { | |
| entry.source.v = void 0; | |
| entry.unsubscribe = noop; | |
| } else { | |
| var is_synchronous_callback = true; | |
| entry.unsubscribe = subscribe_to_store(store2, (v) => { | |
| if (is_synchronous_callback) { | |
| entry.source.v = v; | |
| } else { | |
| set(entry.source, v); | |
| } | |
| }); | |
| is_synchronous_callback = false; | |
| } | |
| } | |
| if (store2 && IS_UNMOUNTED in stores) { | |
| return get$1(store2); | |
| } | |
| return get(entry.source); | |
| } | |
| function setup_stores() { | |
| const stores = {}; | |
| function cleanup() { | |
| teardown(() => { | |
| for (var store_name in stores) { | |
| const ref = stores[store_name]; | |
| ref.unsubscribe(); | |
| } | |
| define_property(stores, IS_UNMOUNTED, { | |
| enumerable: false, | |
| value: true | |
| }); | |
| }); | |
| } | |
| return [stores, cleanup]; | |
| } | |
| let first_batch = null; | |
| let last_batch = null; | |
| let current_batch = null; | |
| let previous_batch = null; | |
| let batch_values = null; | |
| let last_scheduled_effect = null; | |
| let is_flushing_sync = false; | |
| let is_processing = false; | |
| let collected_effects = null; | |
| let legacy_updates = null; | |
| var flush_count = 0; | |
| var source_stacks = /* @__PURE__ */ new Set(); | |
| let uid = 1; | |
| class Batch { | |
| id = uid++; | |
| /** True as soon as `#process` was called */ | |
| #started = false; | |
| linked = true; | |
| /** @type {Batch | null} */ | |
| #prev = null; | |
| /** @type {Batch | null} */ | |
| #next = null; | |
| /** @type {Map<Effect, ReturnType<typeof deferred<any>>>} */ | |
| async_deriveds = /* @__PURE__ */ new Map(); | |
| /** | |
| * The current values of any signals that are updated in this batch. | |
| * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment) | |
| * They keys of this map are identical to `this.#previous` | |
| * @type {Map<Value, [any, boolean]>} | |
| */ | |
| current = /* @__PURE__ */ new Map(); | |
| /** | |
| * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place. | |
| * They keys of this map are identical to `this.#current` | |
| * @type {Map<Value, any>} | |
| */ | |
| previous = /* @__PURE__ */ new Map(); | |
| /** | |
| * Async effects which this batch doesn't take into account anymore when calculating blockers, | |
| * as it has a value for it already. | |
| * @type {Set<Effect>} | |
| */ | |
| unblocked = /* @__PURE__ */ new Set(); | |
| /** | |
| * When the batch is committed (and the DOM is updated), we need to remove old branches | |
| * and append new ones by calling the functions added inside (if/each/key/etc) blocks | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * If a fork is discarded, we need to destroy any effects that are no longer needed | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #discard_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * Callbacks that should run only when a fork is committed. | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #fork_commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * The number of async effects that are currently in flight | |
| */ | |
| #pending = 0; | |
| /** | |
| * Async effects that are currently in flight, _not_ inside a pending boundary | |
| * @type {Map<Effect, number>} | |
| */ | |
| #blocking_pending = /* @__PURE__ */ new Map(); | |
| /** | |
| * A deferred that resolves when the batch is committed, used with `settled()` | |
| * TODO replace with Promise.withResolvers once supported widely enough | |
| * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null} | |
| */ | |
| #deferred = null; | |
| /** | |
| * The root effects that need to be flushed | |
| * @type {Effect[]} | |
| */ | |
| #roots = []; | |
| /** | |
| * Effects created while this batch was active. | |
| * @type {Effect[]} | |
| */ | |
| #new_effects = []; | |
| /** | |
| * Deferred effects (which run after async work has completed) that are DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * Deferred effects that are MAYBE_DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A map of branches that still exist, but will be destroyed when this batch | |
| * is committed — we skip over these during `process`. | |
| * The value contains child effects that were dirty/maybe_dirty before being reset, | |
| * so they can be rescheduled if the branch survives. | |
| * @type {Map<Effect, { d: Effect[], m: Effect[] }>} | |
| */ | |
| #skipped_branches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing | |
| * @type {Set<Effect>} | |
| */ | |
| #unskipped_branches = /* @__PURE__ */ new Set(); | |
| is_fork = false; | |
| #decrement_queued = false; | |
| #is_deferred() { | |
| if (this.is_fork) return true; | |
| for (const effect2 of this.#blocking_pending.keys()) { | |
| var e = effect2; | |
| var skipped = false; | |
| while (e.parent !== null) { | |
| if (this.#skipped_branches.has(e)) { | |
| skipped = true; | |
| break; | |
| } | |
| e = e.parent; | |
| } | |
| if (!skipped) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Add an effect to the #skipped_branches map and reset its children | |
| * @param {Effect} effect | |
| */ | |
| skip_effect(effect2) { | |
| if (!this.#skipped_branches.has(effect2)) { | |
| this.#skipped_branches.set(effect2, { d: [], m: [] }); | |
| } | |
| this.#unskipped_branches.delete(effect2); | |
| } | |
| /** | |
| * Remove an effect from the #skipped_branches map and reschedule | |
| * any tracked dirty/maybe_dirty child effects | |
| * @param {Effect} effect | |
| * @param {(e: Effect) => void} callback | |
| */ | |
| unskip_effect(effect2, callback = (e) => this.schedule(e)) { | |
| var tracked = this.#skipped_branches.get(effect2); | |
| if (tracked) { | |
| this.#skipped_branches.delete(effect2); | |
| for (var e of tracked.d) { | |
| set_signal_status(e, DIRTY); | |
| callback(e); | |
| } | |
| for (e of tracked.m) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| callback(e); | |
| } | |
| } | |
| this.#unskipped_branches.add(effect2); | |
| } | |
| #process() { | |
| this.#started = true; | |
| if (flush_count++ > 1e3) { | |
| this.#unlink(); | |
| infinite_loop_guard(); | |
| } | |
| if (!this.#is_deferred()) { | |
| for (const e of this.#dirty_effects) { | |
| this.#maybe_dirty_effects.delete(e); | |
| set_signal_status(e, DIRTY); | |
| this.schedule(e); | |
| } | |
| for (const e of this.#maybe_dirty_effects) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| this.schedule(e); | |
| } | |
| } | |
| const roots = this.#roots; | |
| this.#roots = []; | |
| this.apply(); | |
| var effects = collected_effects = []; | |
| var render_effects = []; | |
| var updates = legacy_updates = []; | |
| for (const root2 of roots) { | |
| try { | |
| this.#traverse(root2, effects, render_effects); | |
| } catch (e) { | |
| reset_all(root2); | |
| throw e; | |
| } | |
| } | |
| current_batch = null; | |
| if (updates.length > 0) { | |
| var batch = Batch.ensure(); | |
| for (const e of updates) { | |
| batch.schedule(e); | |
| } | |
| } | |
| collected_effects = null; | |
| legacy_updates = null; | |
| if (this.#is_deferred()) { | |
| this.#defer_effects(render_effects); | |
| this.#defer_effects(effects); | |
| for (const [e, t] of this.#skipped_branches) { | |
| reset_branch(e, t); | |
| } | |
| if (updates.length > 0) { | |
| /** @type {unknown} */ | |
| current_batch.#process(); | |
| } | |
| return; | |
| } | |
| const earlier_batch = this.#find_earlier_batch(); | |
| if (earlier_batch) { | |
| earlier_batch.#merge(this); | |
| return; | |
| } | |
| this.#dirty_effects.clear(); | |
| this.#maybe_dirty_effects.clear(); | |
| for (const fn of this.#commit_callbacks) fn(this); | |
| this.#commit_callbacks.clear(); | |
| previous_batch = this; | |
| flush_queued_effects(render_effects); | |
| flush_queued_effects(effects); | |
| previous_batch = null; | |
| this.#deferred?.resolve(); | |
| var next_batch = ( | |
| /** @type {Batch | null} */ | |
| /** @type {unknown} */ | |
| current_batch | |
| ); | |
| if (this.linked && this.#pending === 0) { | |
| this.#unlink(); | |
| } | |
| if (this.#roots.length > 0) { | |
| if (next_batch === null) { | |
| next_batch = this; | |
| this.#link(); | |
| } | |
| const batch2 = next_batch; | |
| batch2.#roots.push(...this.#roots.filter((r2) => !batch2.#roots.includes(r2))); | |
| } | |
| if (next_batch !== null) { | |
| next_batch.#process(); | |
| } | |
| } | |
| /** | |
| * Traverse the effect tree, executing effects or stashing | |
| * them for later execution as appropriate | |
| * @param {Effect} root | |
| * @param {Effect[]} effects | |
| * @param {Effect[]} render_effects | |
| */ | |
| #traverse(root2, effects, render_effects) { | |
| root2.f ^= CLEAN; | |
| var effect2 = root2.first; | |
| while (effect2 !== null) { | |
| var flags2 = effect2.f; | |
| var is_branch = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; | |
| var is_skippable_branch = is_branch && (flags2 & CLEAN) !== 0; | |
| var skip = is_skippable_branch || (flags2 & INERT) !== 0 || this.#skipped_branches.has(effect2); | |
| if (!skip && effect2.fn !== null) { | |
| if (is_branch) { | |
| effect2.f ^= CLEAN; | |
| } else if ((flags2 & EFFECT) !== 0) { | |
| effects.push(effect2); | |
| } else if (is_dirty(effect2)) { | |
| if ((flags2 & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect2); | |
| update_effect(effect2); | |
| } | |
| var child2 = effect2.first; | |
| if (child2 !== null) { | |
| effect2 = child2; | |
| continue; | |
| } | |
| } | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if (next2 !== null) { | |
| effect2 = next2; | |
| break; | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| } | |
| } | |
| #find_earlier_batch() { | |
| var batch = this.#prev; | |
| while (batch !== null) { | |
| if (!batch.is_fork) { | |
| for (const [value, [, is_derived]] of this.current) { | |
| if (batch.current.has(value) && !is_derived) { | |
| return batch; | |
| } | |
| } | |
| } | |
| batch = batch.#prev; | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #merge(batch) { | |
| for (const [source2, value] of batch.current) { | |
| if (!this.previous.has(source2) && batch.previous.has(source2)) { | |
| this.previous.set(source2, batch.previous.get(source2)); | |
| } | |
| this.current.set(source2, value); | |
| } | |
| for (const [effect2, deferred2] of batch.async_deriveds) { | |
| const d = this.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| const mark = (value) => { | |
| var reactions = value.reactions; | |
| if (reactions === null) return; | |
| for (const reaction of reactions) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| } else { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if (flags2 & (ASYNC | BLOCK_EFFECT) && !this.async_deriveds.has(effect2)) { | |
| this.#maybe_dirty_effects.delete(effect2); | |
| set_signal_status(effect2, DIRTY); | |
| this.schedule(effect2); | |
| } | |
| } | |
| } | |
| }; | |
| for (const source2 of this.current.keys()) { | |
| mark(source2); | |
| } | |
| this.oncommit(() => batch.discard()); | |
| batch.#unlink(); | |
| current_batch = this; | |
| this.#process(); | |
| } | |
| /** | |
| * @param {Effect[]} effects | |
| */ | |
| #defer_effects(effects) { | |
| for (var i = 0; i < effects.length; i += 1) { | |
| defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| } | |
| /** | |
| * Associate a change to a given source with the current | |
| * batch, noting its previous and current values | |
| * @param {Value} source | |
| * @param {any} value | |
| * @param {boolean} [is_derived] | |
| */ | |
| capture(source2, value, is_derived = false) { | |
| if (source2.v !== UNINITIALIZED && !this.previous.has(source2)) { | |
| this.previous.set(source2, source2.v); | |
| } | |
| if ((source2.f & ERROR_VALUE) === 0) { | |
| this.current.set(source2, [value, is_derived]); | |
| batch_values?.set(source2, value); | |
| } | |
| if (!this.is_fork) { | |
| source2.v = value; | |
| } | |
| } | |
| activate() { | |
| current_batch = this; | |
| } | |
| deactivate() { | |
| current_batch = null; | |
| batch_values = null; | |
| } | |
| flush() { | |
| try { | |
| if (DEV) ; | |
| is_processing = true; | |
| current_batch = this; | |
| this.#process(); | |
| } finally { | |
| flush_count = 0; | |
| last_scheduled_effect = null; | |
| collected_effects = null; | |
| legacy_updates = null; | |
| is_processing = false; | |
| current_batch = null; | |
| batch_values = null; | |
| old_values.clear(); | |
| } | |
| } | |
| discard() { | |
| for (const fn of this.#discard_callbacks) fn(this); | |
| this.#discard_callbacks.clear(); | |
| this.#fork_commit_callbacks.clear(); | |
| this.#unlink(); | |
| } | |
| /** | |
| * @param {Effect} effect | |
| */ | |
| register_created_effect(effect2) { | |
| this.#new_effects.push(effect2); | |
| } | |
| #commit() { | |
| this.#unlink(); | |
| for (let batch = first_batch; batch !== null; batch = batch.#next) { | |
| var is_earlier = batch.id < this.id; | |
| var sources = []; | |
| for (const [source3, [value, is_derived]] of this.current) { | |
| if (batch.current.has(source3)) { | |
| var batch_value = ( | |
| /** @type {[any, boolean]} */ | |
| batch.current.get(source3)[0] | |
| ); | |
| if (is_earlier && value !== batch_value) { | |
| batch.current.set(source3, [value, is_derived]); | |
| } else { | |
| continue; | |
| } | |
| } | |
| sources.push(source3); | |
| } | |
| if (is_earlier) { | |
| for (const [effect2, deferred2] of this.async_deriveds) { | |
| const d = batch.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| } | |
| if (!batch.#started) continue; | |
| var others = [...batch.current.keys()].filter((s) => !this.current.has(s)); | |
| if (others.length === 0) { | |
| if (is_earlier) { | |
| batch.discard(); | |
| } | |
| } else if (sources.length > 0) { | |
| if (is_earlier) { | |
| for (const unskipped of this.#unskipped_branches) { | |
| batch.unskip_effect(unskipped, (e) => { | |
| if ((e.f & (BLOCK_EFFECT | ASYNC)) !== 0) { | |
| batch.schedule(e); | |
| } else { | |
| batch.#defer_effects([e]); | |
| } | |
| }); | |
| } | |
| } | |
| batch.activate(); | |
| var marked = /* @__PURE__ */ new Set(); | |
| var checked = /* @__PURE__ */ new Map(); | |
| for (var source2 of sources) { | |
| mark_effects(source2, others, marked, checked); | |
| } | |
| checked = /* @__PURE__ */ new Map(); | |
| var current_unequal = [...batch.current.keys()].filter( | |
| (c) => this.current.has(c) ? ( | |
| /** @type {[any, boolean]} */ | |
| this.current.get(c)[0] !== c.v | |
| ) : true | |
| ); | |
| if (current_unequal.length > 0) { | |
| for (const effect2 of this.#new_effects) { | |
| if ((effect2.f & (DESTROYED | INERT | EAGER_EFFECT)) === 0 && depends_on(effect2, current_unequal, checked)) { | |
| if ((effect2.f & (ASYNC | BLOCK_EFFECT)) !== 0) { | |
| set_signal_status(effect2, DIRTY); | |
| batch.schedule(effect2); | |
| } else { | |
| batch.#dirty_effects.add(effect2); | |
| } | |
| } | |
| } | |
| } | |
| if (batch.#roots.length > 0) { | |
| batch.apply(); | |
| for (var root2 of batch.#roots) { | |
| batch.#traverse(root2, [], []); | |
| } | |
| batch.#roots = []; | |
| } | |
| batch.deactivate(); | |
| } | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| increment(blocking, effect2) { | |
| this.#pending += 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| this.#blocking_pending.set(effect2, blocking_pending_count + 1); | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| decrement(blocking, effect2) { | |
| this.#pending -= 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| if (blocking_pending_count === 1) { | |
| this.#blocking_pending.delete(effect2); | |
| } else { | |
| this.#blocking_pending.set(effect2, blocking_pending_count - 1); | |
| } | |
| } | |
| if (this.#decrement_queued) return; | |
| this.#decrement_queued = true; | |
| queue_micro_task(() => { | |
| this.#decrement_queued = false; | |
| if (this.linked) { | |
| this.flush(); | |
| } | |
| }); | |
| } | |
| /** | |
| * @param {Set<Effect>} dirty_effects | |
| * @param {Set<Effect>} maybe_dirty_effects | |
| */ | |
| transfer_effects(dirty_effects, maybe_dirty_effects) { | |
| for (const e of dirty_effects) { | |
| this.#dirty_effects.add(e); | |
| } | |
| for (const e of maybe_dirty_effects) { | |
| this.#maybe_dirty_effects.add(e); | |
| } | |
| dirty_effects.clear(); | |
| maybe_dirty_effects.clear(); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| oncommit(fn) { | |
| this.#commit_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| ondiscard(fn) { | |
| this.#discard_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| on_fork_commit(fn) { | |
| this.#fork_commit_callbacks.add(fn); | |
| } | |
| run_fork_commit_callbacks() { | |
| for (const fn of this.#fork_commit_callbacks) fn(this); | |
| this.#fork_commit_callbacks.clear(); | |
| } | |
| settled() { | |
| return (this.#deferred ??= deferred()).promise; | |
| } | |
| static ensure() { | |
| if (current_batch === null) { | |
| const batch = current_batch = new Batch(); | |
| batch.#link(); | |
| if (!is_processing && !is_flushing_sync) { | |
| queue_micro_task(() => { | |
| if (!batch.#started) { | |
| batch.flush(); | |
| } | |
| }); | |
| } | |
| } | |
| return current_batch; | |
| } | |
| apply() { | |
| { | |
| batch_values = null; | |
| return; | |
| } | |
| } | |
| /** | |
| * | |
| * @param {Effect} effect | |
| */ | |
| schedule(effect2) { | |
| last_scheduled_effect = effect2; | |
| if (effect2.b?.is_pending && (effect2.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 && (effect2.f & REACTION_RAN) === 0) { | |
| effect2.b.defer_effect(effect2); | |
| return; | |
| } | |
| var e = effect2; | |
| while (e.parent !== null) { | |
| e = e.parent; | |
| var flags2 = e.f; | |
| if (collected_effects !== null && e === active_effect) { | |
| if ((active_reaction === null || (active_reaction.f & DERIVED) === 0) && true) { | |
| return; | |
| } | |
| } | |
| if ((flags2 & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { | |
| if ((flags2 & CLEAN) === 0) { | |
| return; | |
| } | |
| e.f ^= CLEAN; | |
| } | |
| } | |
| this.#roots.push(e); | |
| } | |
| #link() { | |
| if (last_batch === null) { | |
| first_batch = last_batch = this; | |
| } else { | |
| last_batch.#next = this; | |
| this.#prev = last_batch; | |
| } | |
| last_batch = this; | |
| } | |
| #unlink() { | |
| var prev = this.#prev; | |
| var next2 = this.#next; | |
| if (prev === null) { | |
| first_batch = next2; | |
| } else { | |
| prev.#next = next2; | |
| } | |
| if (next2 === null) { | |
| last_batch = prev; | |
| } else { | |
| next2.#prev = prev; | |
| } | |
| this.linked = false; | |
| } | |
| } | |
| function flushSync(fn) { | |
| var was_flushing_sync = is_flushing_sync; | |
| is_flushing_sync = true; | |
| try { | |
| var result; | |
| if (fn) ; | |
| while (true) { | |
| flush_tasks(); | |
| if (current_batch === null) { | |
| return ( | |
| /** @type {T} */ | |
| result | |
| ); | |
| } | |
| current_batch.flush(); | |
| } | |
| } finally { | |
| is_flushing_sync = was_flushing_sync; | |
| } | |
| } | |
| function infinite_loop_guard() { | |
| try { | |
| effect_update_depth_exceeded(); | |
| } catch (error) { | |
| invoke_error_boundary(error, last_scheduled_effect); | |
| } | |
| } | |
| let eager_block_effects = null; | |
| function flush_queued_effects(effects) { | |
| var length = effects.length; | |
| if (length === 0) return; | |
| var i = 0; | |
| while (i < length) { | |
| var effect2 = effects[i++]; | |
| if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) { | |
| eager_block_effects = /* @__PURE__ */ new Set(); | |
| update_effect(effect2); | |
| if (effect2.deps === null && effect2.first === null && effect2.nodes === null && effect2.teardown === null && effect2.ac === null) { | |
| unlink_effect(effect2); | |
| } | |
| if (eager_block_effects?.size > 0) { | |
| old_values.clear(); | |
| for (const e of eager_block_effects) { | |
| if ((e.f & (DESTROYED | INERT)) !== 0) continue; | |
| const ordered_effects = [e]; | |
| let ancestor = e.parent; | |
| while (ancestor !== null) { | |
| if (eager_block_effects.has(ancestor)) { | |
| eager_block_effects.delete(ancestor); | |
| ordered_effects.push(ancestor); | |
| } | |
| ancestor = ancestor.parent; | |
| } | |
| for (let j = ordered_effects.length - 1; j >= 0; j--) { | |
| const e2 = ordered_effects[j]; | |
| if ((e2.f & (DESTROYED | INERT)) !== 0) continue; | |
| update_effect(e2); | |
| } | |
| } | |
| eager_block_effects.clear(); | |
| } | |
| } | |
| } | |
| eager_block_effects = null; | |
| } | |
| function mark_effects(value, sources, marked, checked) { | |
| if (marked.has(value)) return; | |
| marked.add(value); | |
| if (value.reactions !== null) { | |
| for (const reaction of value.reactions) { | |
| const flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark_effects( | |
| /** @type {Derived} */ | |
| reaction, | |
| sources, | |
| marked, | |
| checked | |
| ); | |
| } else if ((flags2 & (ASYNC | BLOCK_EFFECT)) !== 0 && (flags2 & DIRTY) === 0 && depends_on(reaction, sources, checked)) { | |
| set_signal_status(reaction, DIRTY); | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| function depends_on(reaction, sources, checked) { | |
| const depends = checked.get(reaction); | |
| if (depends !== void 0) return depends; | |
| if (reaction.deps !== null) { | |
| for (const dep of reaction.deps) { | |
| if (includes.call(sources, dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on( | |
| /** @type {Derived} */ | |
| dep, | |
| sources, | |
| checked | |
| )) { | |
| checked.set( | |
| /** @type {Derived} */ | |
| dep, | |
| true | |
| ); | |
| return true; | |
| } | |
| } | |
| } | |
| checked.set(reaction, false); | |
| return false; | |
| } | |
| function schedule_effect(effect2) { | |
| current_batch.schedule(effect2); | |
| } | |
| function reset_branch(effect2, tracked) { | |
| if ((effect2.f & BRANCH_EFFECT) !== 0 && (effect2.f & CLEAN) !== 0) { | |
| return; | |
| } | |
| if ((effect2.f & DIRTY) !== 0) { | |
| tracked.d.push(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| tracked.m.push(effect2); | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_branch(e, tracked); | |
| e = e.next; | |
| } | |
| } | |
| function reset_all(effect2) { | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_all(e); | |
| e = e.next; | |
| } | |
| } | |
| function createSubscriber(start) { | |
| let subscribers = 0; | |
| let version = source(0); | |
| let stop; | |
| return () => { | |
| if (effect_tracking()) { | |
| get(version); | |
| render_effect(() => { | |
| if (subscribers === 0) { | |
| stop = untrack(() => start(() => increment(version))); | |
| } | |
| subscribers += 1; | |
| return () => { | |
| queue_micro_task(() => { | |
| subscribers -= 1; | |
| if (subscribers === 0) { | |
| stop?.(); | |
| stop = void 0; | |
| increment(version); | |
| } | |
| }); | |
| }; | |
| }); | |
| } | |
| }; | |
| } | |
| var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED; | |
| function boundary(node, props, children, transform_error) { | |
| new Boundary(node, props, children, transform_error); | |
| } | |
| class Boundary { | |
| /** @type {Boundary | null} */ | |
| parent; | |
| is_pending = false; | |
| /** | |
| * API-level transformError transform function. Transforms errors before they reach the `failed` snippet. | |
| * Inherited from parent boundary, or defaults to identity. | |
| * @type {(error: unknown) => unknown} | |
| */ | |
| transform_error; | |
| /** @type {TemplateNode} */ | |
| #anchor; | |
| /** @type {TemplateNode | null} */ | |
| #hydrate_open = hydrating ? hydrate_node : null; | |
| /** @type {BoundaryProps} */ | |
| #props; | |
| /** @type {((anchor: Node) => void)} */ | |
| #children; | |
| /** @type {Effect} */ | |
| #effect; | |
| /** @type {Effect | null} */ | |
| #main_effect = null; | |
| /** @type {Effect | null} */ | |
| #pending_effect = null; | |
| /** @type {Effect | null} */ | |
| #failed_effect = null; | |
| /** @type {DocumentFragment | null} */ | |
| #offscreen_fragment = null; | |
| #local_pending_count = 0; | |
| #pending_count = 0; | |
| #pending_count_update_queued = false; | |
| /** @type {Set<Effect>} */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** @type {Set<Effect>} */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A source containing the number of pending async deriveds/expressions. | |
| * Only created if `$effect.pending()` is used inside the boundary, | |
| * otherwise updating the source results in needless `Batch.ensure()` | |
| * calls followed by no-op flushes | |
| * @type {Source<number> | null} | |
| */ | |
| #effect_pending = null; | |
| #effect_pending_subscriber = createSubscriber(() => { | |
| this.#effect_pending = source(this.#local_pending_count); | |
| return () => { | |
| this.#effect_pending = null; | |
| }; | |
| }); | |
| /** | |
| * @param {TemplateNode} node | |
| * @param {BoundaryProps} props | |
| * @param {((anchor: Node) => void)} children | |
| * @param {((error: unknown) => unknown) | undefined} [transform_error] | |
| */ | |
| constructor(node, props, children, transform_error) { | |
| this.#anchor = node; | |
| this.#props = props; | |
| this.#children = (anchor) => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| children(anchor); | |
| }; | |
| this.parent = /** @type {Effect} */ | |
| active_effect.b; | |
| this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e); | |
| this.#effect = block(() => { | |
| if (hydrating) { | |
| const comment2 = ( | |
| /** @type {Comment} */ | |
| this.#hydrate_open | |
| ); | |
| hydrate_next(); | |
| const server_rendered_pending = comment2.data === HYDRATION_START_ELSE; | |
| const server_rendered_failed = comment2.data.startsWith(HYDRATION_START_FAILED); | |
| if (server_rendered_failed) { | |
| const serialized_error = JSON.parse(comment2.data.slice(HYDRATION_START_FAILED.length)); | |
| this.#hydrate_failed_content(serialized_error); | |
| } else if (server_rendered_pending) { | |
| this.#hydrate_pending_content(); | |
| } else { | |
| this.#hydrate_resolved_content(); | |
| } | |
| } else { | |
| this.#render(); | |
| } | |
| }, flags); | |
| if (hydrating) { | |
| this.#anchor = hydrate_node; | |
| } | |
| } | |
| #hydrate_resolved_content() { | |
| try { | |
| this.#main_effect = branch(() => this.#children(this.#anchor)); | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error The deserialized error from the server's hydration comment | |
| */ | |
| #hydrate_failed_content(error) { | |
| const failed = this.#props.failed; | |
| if (!failed) return; | |
| this.#failed_effect = branch(() => { | |
| failed( | |
| this.#anchor, | |
| () => error, | |
| () => () => { | |
| } | |
| ); | |
| }); | |
| } | |
| #hydrate_pending_content() { | |
| const pending = this.#props.pending; | |
| if (!pending) return; | |
| this.is_pending = true; | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| queue_micro_task(() => { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| var anchor = create_text(); | |
| fragment.append(anchor); | |
| this.#main_effect = this.#run(() => { | |
| return branch(() => this.#children(anchor)); | |
| }); | |
| if (this.#pending_count === 0) { | |
| this.#anchor.before(fragment); | |
| this.#offscreen_fragment = null; | |
| pause_effect( | |
| /** @type {Effect} */ | |
| this.#pending_effect, | |
| () => { | |
| this.#pending_effect = null; | |
| } | |
| ); | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| }); | |
| } | |
| #render() { | |
| try { | |
| this.is_pending = this.has_pending_snippet(); | |
| this.#pending_count = 0; | |
| this.#local_pending_count = 0; | |
| this.#main_effect = branch(() => { | |
| this.#children(this.#anchor); | |
| }); | |
| if (this.#pending_count > 0) { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| move_effect(this.#main_effect, fragment); | |
| const pending = ( | |
| /** @type {(anchor: Node) => void} */ | |
| this.#props.pending | |
| ); | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| } else { | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #resolve(batch) { | |
| this.is_pending = false; | |
| batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Defer an effect inside a pending boundary until the boundary resolves | |
| * @param {Effect} effect | |
| */ | |
| defer_effect(effect2) { | |
| defer_effect(effect2, this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Returns `false` if the effect exists inside a boundary whose pending snippet is shown | |
| * @returns {boolean} | |
| */ | |
| is_rendered() { | |
| return !this.is_pending && (!this.parent || this.parent.is_rendered()); | |
| } | |
| has_pending_snippet() { | |
| return !!this.#props.pending; | |
| } | |
| /** | |
| * @template T | |
| * @param {() => T} fn | |
| */ | |
| #run(fn) { | |
| var previous_effect = active_effect; | |
| var previous_reaction = active_reaction; | |
| var previous_ctx = component_context; | |
| set_active_effect(this.#effect); | |
| set_active_reaction(this.#effect); | |
| set_component_context(this.#effect.ctx); | |
| try { | |
| Batch.ensure(); | |
| return fn(); | |
| } catch (e) { | |
| handle_error(e); | |
| return null; | |
| } finally { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_ctx); | |
| } | |
| } | |
| /** | |
| * Updates the pending count associated with the currently visible pending snippet, | |
| * if any, such that we can replace the snippet with content once work is done | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| #update_pending_count(d, batch) { | |
| if (!this.has_pending_snippet()) { | |
| if (this.parent) { | |
| this.parent.#update_pending_count(d, batch); | |
| } | |
| return; | |
| } | |
| this.#pending_count += d; | |
| if (this.#pending_count === 0) { | |
| this.#resolve(batch); | |
| if (this.#pending_effect) { | |
| pause_effect(this.#pending_effect, () => { | |
| this.#pending_effect = null; | |
| }); | |
| } | |
| if (this.#offscreen_fragment) { | |
| this.#anchor.before(this.#offscreen_fragment); | |
| this.#offscreen_fragment = null; | |
| } | |
| } | |
| } | |
| /** | |
| * Update the source that powers `$effect.pending()` inside this boundary, | |
| * and controls when the current `pending` snippet (if any) is removed. | |
| * Do not call from inside the class | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| update_pending_count(d, batch) { | |
| this.#update_pending_count(d, batch); | |
| this.#local_pending_count += d; | |
| if (!this.#effect_pending || this.#pending_count_update_queued) return; | |
| this.#pending_count_update_queued = true; | |
| queue_micro_task(() => { | |
| this.#pending_count_update_queued = false; | |
| if (this.#effect_pending) { | |
| internal_set(this.#effect_pending, this.#local_pending_count); | |
| } | |
| }); | |
| } | |
| get_effect_pending() { | |
| this.#effect_pending_subscriber(); | |
| return get( | |
| /** @type {Source<number>} */ | |
| this.#effect_pending | |
| ); | |
| } | |
| /** @param {unknown} error */ | |
| error(error) { | |
| if (!this.#props.onerror && !this.#props.failed) { | |
| throw error; | |
| } | |
| if (current_batch?.is_fork) { | |
| if (this.#main_effect) current_batch.skip_effect(this.#main_effect); | |
| if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect); | |
| if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect); | |
| current_batch.on_fork_commit(() => { | |
| this.#handle_error(error); | |
| }); | |
| } else { | |
| this.#handle_error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error | |
| */ | |
| #handle_error(error) { | |
| if (this.#main_effect) { | |
| destroy_effect(this.#main_effect); | |
| this.#main_effect = null; | |
| } | |
| if (this.#pending_effect) { | |
| destroy_effect(this.#pending_effect); | |
| this.#pending_effect = null; | |
| } | |
| if (this.#failed_effect) { | |
| destroy_effect(this.#failed_effect); | |
| this.#failed_effect = null; | |
| } | |
| if (hydrating) { | |
| set_hydrate_node( | |
| /** @type {TemplateNode} */ | |
| this.#hydrate_open | |
| ); | |
| next(); | |
| set_hydrate_node(skip_nodes()); | |
| } | |
| var onerror = this.#props.onerror; | |
| let failed = this.#props.failed; | |
| var did_reset = false; | |
| var calling_on_error = false; | |
| const reset2 = () => { | |
| if (did_reset) { | |
| svelte_boundary_reset_noop(); | |
| return; | |
| } | |
| did_reset = true; | |
| if (calling_on_error) { | |
| svelte_boundary_reset_onerror(); | |
| } | |
| if (this.#failed_effect !== null) { | |
| pause_effect(this.#failed_effect, () => { | |
| this.#failed_effect = null; | |
| }); | |
| } | |
| this.#run(() => { | |
| this.#render(); | |
| }); | |
| }; | |
| const handle_error_result = (transformed_error) => { | |
| try { | |
| calling_on_error = true; | |
| onerror?.(transformed_error, reset2); | |
| calling_on_error = false; | |
| } catch (error2) { | |
| invoke_error_boundary(error2, this.#effect && this.#effect.parent); | |
| } | |
| if (failed) { | |
| this.#failed_effect = this.#run(() => { | |
| try { | |
| return branch(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| failed( | |
| this.#anchor, | |
| () => transformed_error, | |
| () => reset2 | |
| ); | |
| }); | |
| } catch (error2) { | |
| invoke_error_boundary( | |
| error2, | |
| /** @type {Effect} */ | |
| this.#effect.parent | |
| ); | |
| return null; | |
| } | |
| }); | |
| } | |
| }; | |
| queue_micro_task(() => { | |
| var result; | |
| try { | |
| result = this.transform_error(error); | |
| } catch (e) { | |
| invoke_error_boundary(e, this.#effect && this.#effect.parent); | |
| return; | |
| } | |
| if (result !== null && typeof result === "object" && typeof /** @type {any} */ | |
| result.then === "function") { | |
| result.then( | |
| handle_error_result, | |
| /** @param {unknown} e */ | |
| (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent) | |
| ); | |
| } else { | |
| handle_error_result(result); | |
| } | |
| }); | |
| } | |
| } | |
| function flatten(blockers, sync, async, fn) { | |
| const d = derived; | |
| var pending = blockers.filter((b) => !b.settled); | |
| if (async.length === 0 && pending.length === 0) { | |
| fn(sync.map(d)); | |
| return; | |
| } | |
| var parent = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var restore = capture(); | |
| var blocker_promise = pending.length === 1 ? pending[0].promise : pending.length > 1 ? Promise.all(pending.map((b) => b.promise)) : null; | |
| function finish(values) { | |
| if ((parent.f & DESTROYED) !== 0) { | |
| return; | |
| } | |
| restore(); | |
| try { | |
| fn(values); | |
| } catch (error) { | |
| invoke_error_boundary(error, parent); | |
| } | |
| unset_context(); | |
| } | |
| var decrement_pending = increment_pending(); | |
| if (async.length === 0) { | |
| blocker_promise.then(() => finish(sync.map(d))).finally(decrement_pending); | |
| return; | |
| } | |
| function run() { | |
| Promise.all(async.map((expression) => /* @__PURE__ */ async_derived(expression))).then((result) => finish([...sync.map(d), ...result])).catch((error) => invoke_error_boundary(error, parent)).finally(decrement_pending); | |
| } | |
| if (blocker_promise) { | |
| blocker_promise.then(() => { | |
| restore(); | |
| run(); | |
| unset_context(); | |
| }); | |
| } else { | |
| run(); | |
| } | |
| } | |
| function capture() { | |
| var previous_effect = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var previous_reaction = active_reaction; | |
| var previous_component_context = component_context; | |
| var previous_batch2 = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| return function restore(activate_batch = true) { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_component_context); | |
| if (activate_batch && (previous_effect.f & DESTROYED) === 0) { | |
| previous_batch2?.activate(); | |
| previous_batch2?.apply(); | |
| } | |
| }; | |
| } | |
| function unset_context(deactivate_batch = true) { | |
| set_active_effect(null); | |
| set_active_reaction(null); | |
| set_component_context(null); | |
| if (deactivate_batch) current_batch?.deactivate(); | |
| } | |
| function increment_pending() { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var boundary2 = ( | |
| /** @type {Boundary} */ | |
| effect2.b | |
| ); | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| var blocking = boundary2.is_rendered(); | |
| boundary2.update_pending_count(1, batch); | |
| batch.increment(blocking, effect2); | |
| return () => { | |
| boundary2.update_pending_count(-1, batch); | |
| batch.decrement(blocking, effect2); | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function derived(fn) { | |
| var flags2 = DERIVED | DIRTY; | |
| if (active_effect !== null) { | |
| active_effect.f |= EFFECT_PRESERVED; | |
| } | |
| const signal = { | |
| ctx: component_context, | |
| deps: null, | |
| effects: null, | |
| equals, | |
| f: flags2, | |
| fn, | |
| reactions: null, | |
| rv: 0, | |
| v: ( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ), | |
| wv: 0, | |
| parent: active_effect, | |
| ac: null | |
| }; | |
| return signal; | |
| } | |
| const OBSOLETE = /* @__PURE__ */ Symbol("obsolete"); | |
| // @__NO_SIDE_EFFECTS__ | |
| function async_derived(fn, label, location2) { | |
| let parent = ( | |
| /** @type {Effect | null} */ | |
| active_effect | |
| ); | |
| if (parent === null) { | |
| async_derived_orphan(); | |
| } | |
| var promise = ( | |
| /** @type {Promise<V>} */ | |
| /** @type {unknown} */ | |
| void 0 | |
| ); | |
| var signal = source( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ); | |
| var should_suspend = !active_reaction; | |
| var deferreds = /* @__PURE__ */ new Set(); | |
| async_effect(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var d = deferred(); | |
| promise = d.promise; | |
| try { | |
| Promise.resolve(fn()).then(d.resolve, (e) => { | |
| if (e !== STALE_REACTION) d.reject(e); | |
| }).finally(unset_context); | |
| } catch (error) { | |
| d.reject(error); | |
| unset_context(); | |
| } | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| if (should_suspend) { | |
| if ((effect2.f & REACTION_RAN) !== 0) { | |
| var decrement_pending = increment_pending(); | |
| } | |
| if ( | |
| /** @type {Boundary} */ | |
| parent.b.is_rendered() | |
| ) { | |
| batch.async_deriveds.get(effect2)?.reject(OBSOLETE); | |
| } else { | |
| for (const d2 of deferreds.values()) { | |
| d2.reject(OBSOLETE); | |
| } | |
| } | |
| deferreds.add(d); | |
| batch.async_deriveds.set(effect2, d); | |
| } | |
| const handler = (value, error = void 0) => { | |
| decrement_pending?.(); | |
| deferreds.delete(d); | |
| if (error === OBSOLETE) return; | |
| batch.activate(); | |
| if (error) { | |
| signal.f |= ERROR_VALUE; | |
| internal_set(signal, error); | |
| } else { | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| signal.f ^= ERROR_VALUE; | |
| } | |
| internal_set(signal, value); | |
| } | |
| batch.deactivate(); | |
| }; | |
| d.promise.then(handler, (e) => handler(null, e || "unknown")); | |
| }); | |
| teardown(() => { | |
| for (const d of deferreds) { | |
| d.reject(OBSOLETE); | |
| } | |
| }); | |
| return new Promise((fulfil) => { | |
| function next2(p) { | |
| function go() { | |
| if (p === promise) { | |
| fulfil(signal); | |
| } else { | |
| next2(promise); | |
| } | |
| } | |
| p.then(go, go); | |
| } | |
| next2(promise); | |
| }); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function user_derived(fn) { | |
| const d = /* @__PURE__ */ derived(fn); | |
| push_reaction_value(d); | |
| return d; | |
| } | |
| function destroy_derived_effects(derived2) { | |
| var effects = derived2.effects; | |
| if (effects !== null) { | |
| derived2.effects = null; | |
| for (var i = 0; i < effects.length; i += 1) { | |
| destroy_effect( | |
| /** @type {Effect} */ | |
| effects[i] | |
| ); | |
| } | |
| } | |
| } | |
| function execute_derived(derived2) { | |
| var value; | |
| var prev_active_effect = active_effect; | |
| var parent = derived2.parent; | |
| if (!is_destroying_effect && parent !== null && derived2.v !== UNINITIALIZED && // if it was never evaluated before, it's guaranteed to fail downstream, so we try to execute instead | |
| (parent.f & (DESTROYED | INERT)) !== 0) { | |
| derived_inert(); | |
| return derived2.v; | |
| } | |
| set_active_effect(parent); | |
| { | |
| try { | |
| derived2.f &= ~WAS_MARKED; | |
| destroy_derived_effects(derived2); | |
| value = update_reaction(derived2); | |
| } finally { | |
| set_active_effect(prev_active_effect); | |
| } | |
| } | |
| return value; | |
| } | |
| function update_derived(derived2) { | |
| var value = execute_derived(derived2); | |
| if (!derived2.equals(value)) { | |
| derived2.wv = increment_write_version(); | |
| if (!current_batch?.is_fork || derived2.deps === null) { | |
| if (current_batch !== null) { | |
| current_batch.capture(derived2, value, true); | |
| previous_batch?.capture(derived2, value, true); | |
| } else { | |
| derived2.v = value; | |
| } | |
| if (derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| return; | |
| } | |
| } | |
| } | |
| if (is_destroying_effect) { | |
| return; | |
| } | |
| if (batch_values !== null) { | |
| if (effect_tracking() || current_batch?.is_fork) { | |
| batch_values.set(derived2, value); | |
| } | |
| } else { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| function freeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown || e.ac) { | |
| e.teardown?.(); | |
| e.ac?.abort(STALE_REACTION); | |
| if (e.fn !== null) e.teardown = noop; | |
| e.ac = null; | |
| remove_reactions(e, 0); | |
| destroy_effect_children(e); | |
| } | |
| } | |
| } | |
| function unfreeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown && e.fn !== null) { | |
| update_effect(e); | |
| } | |
| } | |
| } | |
| let eager_effects = /* @__PURE__ */ new Set(); | |
| const old_values = /* @__PURE__ */ new Map(); | |
| let eager_effects_deferred = false; | |
| function source(v, stack) { | |
| var signal = { | |
| f: 0, | |
| // TODO ideally we could skip this altogether, but it causes type errors | |
| v, | |
| reactions: null, | |
| equals, | |
| rv: 0, | |
| wv: 0 | |
| }; | |
| return signal; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function state(v, stack) { | |
| const s = source(v); | |
| push_reaction_value(s); | |
| return s; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function mutable_source(initial_value, immutable = false, trackable = true) { | |
| const s = source(initial_value); | |
| if (!immutable) { | |
| s.equals = safe_equals; | |
| } | |
| return s; | |
| } | |
| function set(source2, value, should_proxy = false) { | |
| if (active_reaction !== null && // since we are untracking the function inside `$inspect.with` we need to add this check | |
| // to ensure we error if state is set inside an inspect effect | |
| (!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 && (current_sources === null || !includes.call(current_sources, source2))) { | |
| state_unsafe_mutation(); | |
| } | |
| let new_value = should_proxy ? proxy(value) : value; | |
| return internal_set(source2, new_value, legacy_updates); | |
| } | |
| function internal_set(source2, value, updated_during_traversal = null) { | |
| if (!source2.equals(value)) { | |
| old_values.set(source2, is_destroying_effect ? value : source2.v); | |
| var batch = Batch.ensure(); | |
| batch.capture(source2, value); | |
| if ((source2.f & DERIVED) !== 0) { | |
| const derived2 = ( | |
| /** @type {Derived} */ | |
| source2 | |
| ); | |
| if ((source2.f & DIRTY) !== 0) { | |
| execute_derived(derived2); | |
| } | |
| if (batch_values === null) { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| source2.wv = increment_write_version(); | |
| mark_reactions(source2, DIRTY, updated_during_traversal); | |
| if (active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { | |
| if (untracked_writes === null) { | |
| set_untracked_writes([source2]); | |
| } else { | |
| untracked_writes.push(source2); | |
| } | |
| } | |
| if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) { | |
| flush_eager_effects(); | |
| } | |
| } | |
| return value; | |
| } | |
| function flush_eager_effects() { | |
| eager_effects_deferred = false; | |
| for (const effect2 of eager_effects) { | |
| if ((effect2.f & CLEAN) !== 0) { | |
| set_signal_status(effect2, MAYBE_DIRTY); | |
| } | |
| let dirty; | |
| try { | |
| dirty = is_dirty(effect2); | |
| } catch { | |
| dirty = true; | |
| } | |
| if (dirty) { | |
| update_effect(effect2); | |
| } | |
| } | |
| eager_effects.clear(); | |
| } | |
| function increment(source2) { | |
| set(source2, source2.v + 1); | |
| } | |
| function mark_reactions(signal, status, updated_during_traversal) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| var length = reactions.length; | |
| for (var i = 0; i < length; i++) { | |
| var reaction = reactions[i]; | |
| var flags2 = reaction.f; | |
| var not_dirty = (flags2 & DIRTY) === 0; | |
| if (not_dirty) { | |
| set_signal_status(reaction, status); | |
| } | |
| if ((flags2 & EAGER_EFFECT) !== 0) { | |
| eager_effects.add( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } else if ((flags2 & DERIVED) !== 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| batch_values?.delete(derived2); | |
| if ((flags2 & WAS_MARKED) === 0) { | |
| if (flags2 & CONNECTED && (active_effect === null || (active_effect.f & REACTION_IS_UPDATING) === 0)) { | |
| reaction.f |= WAS_MARKED; | |
| } | |
| mark_reactions(derived2, MAYBE_DIRTY, updated_during_traversal); | |
| } | |
| } else if (not_dirty) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if ((flags2 & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) { | |
| eager_block_effects.add(effect2); | |
| } | |
| if (updated_during_traversal !== null) { | |
| updated_during_traversal.push(effect2); | |
| } else { | |
| schedule_effect(effect2); | |
| } | |
| } | |
| } | |
| } | |
| function autofocus(dom, value) { | |
| if (value) { | |
| const body = document.body; | |
| dom.autofocus = true; | |
| queue_micro_task(() => { | |
| if (document.activeElement === body) { | |
| dom.focus(); | |
| } | |
| }); | |
| } | |
| } | |
| let listening_to_form_reset = false; | |
| function add_form_reset_listener() { | |
| if (!listening_to_form_reset) { | |
| listening_to_form_reset = true; | |
| document.addEventListener( | |
| "reset", | |
| (evt) => { | |
| Promise.resolve().then(() => { | |
| if (!evt.defaultPrevented) { | |
| for ( | |
| const e of | |
| /**@type {HTMLFormElement} */ | |
| evt.target.elements | |
| ) { | |
| e[FORM_RESET_HANDLER]?.(); | |
| } | |
| } | |
| }); | |
| }, | |
| // In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation) | |
| { capture: true } | |
| ); | |
| } | |
| } | |
| function without_reactive_context(fn) { | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| return fn(); | |
| } finally { | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| function listen_to_event_and_reset_event(element, event2, handler, on_reset = handler) { | |
| element.addEventListener(event2, () => without_reactive_context(handler)); | |
| const prev = ( | |
| /** @type {any} */ | |
| element[FORM_RESET_HANDLER] | |
| ); | |
| if (prev) { | |
| element[FORM_RESET_HANDLER] = () => { | |
| prev(); | |
| on_reset(true); | |
| }; | |
| } else { | |
| element[FORM_RESET_HANDLER] = () => on_reset(true); | |
| } | |
| add_form_reset_listener(); | |
| } | |
| let is_updating_effect = false; | |
| let is_destroying_effect = false; | |
| function set_is_destroying_effect(value) { | |
| is_destroying_effect = value; | |
| } | |
| let active_reaction = null; | |
| let untracking = false; | |
| function set_active_reaction(reaction) { | |
| active_reaction = reaction; | |
| } | |
| let active_effect = null; | |
| function set_active_effect(effect2) { | |
| active_effect = effect2; | |
| } | |
| let current_sources = null; | |
| function push_reaction_value(value) { | |
| if (active_reaction !== null && true) { | |
| if (current_sources === null) { | |
| current_sources = [value]; | |
| } else { | |
| current_sources.push(value); | |
| } | |
| } | |
| } | |
| let new_deps = null; | |
| let skipped_deps = 0; | |
| let untracked_writes = null; | |
| function set_untracked_writes(value) { | |
| untracked_writes = value; | |
| } | |
| let write_version = 1; | |
| let read_version = 0; | |
| let update_version = read_version; | |
| function set_update_version(value) { | |
| update_version = value; | |
| } | |
| function increment_write_version() { | |
| return ++write_version; | |
| } | |
| function is_dirty(reaction) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DIRTY) !== 0) { | |
| return true; | |
| } | |
| if (flags2 & DERIVED) { | |
| reaction.f &= ~WAS_MARKED; | |
| } | |
| if ((flags2 & MAYBE_DIRTY) !== 0) { | |
| var dependencies = ( | |
| /** @type {Value[]} */ | |
| reaction.deps | |
| ); | |
| var length = dependencies.length; | |
| for (var i = 0; i < length; i++) { | |
| var dependency = dependencies[i]; | |
| if (is_dirty( | |
| /** @type {Derived} */ | |
| dependency | |
| )) { | |
| update_derived( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| } | |
| if (dependency.wv > reaction.wv) { | |
| return true; | |
| } | |
| } | |
| if ((flags2 & CONNECTED) !== 0 && // During time traveling we don't want to reset the status so that | |
| // traversal of the graph in the other batches still happens | |
| batch_values === null) { | |
| set_signal_status(reaction, CLEAN); | |
| } | |
| } | |
| return false; | |
| } | |
| function schedule_possible_effect_self_invalidation(signal, effect2, root2 = true) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| if (current_sources !== null && includes.call(current_sources, signal)) { | |
| return; | |
| } | |
| for (var i = 0; i < reactions.length; i++) { | |
| var reaction = reactions[i]; | |
| if ((reaction.f & DERIVED) !== 0) { | |
| schedule_possible_effect_self_invalidation( | |
| /** @type {Derived} */ | |
| reaction, | |
| effect2, | |
| false | |
| ); | |
| } else if (effect2 === reaction) { | |
| if (root2) { | |
| set_signal_status(reaction, DIRTY); | |
| } else if ((reaction.f & CLEAN) !== 0) { | |
| set_signal_status(reaction, MAYBE_DIRTY); | |
| } | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| function update_reaction(reaction) { | |
| var previous_deps = new_deps; | |
| var previous_skipped_deps = skipped_deps; | |
| var previous_untracked_writes = untracked_writes; | |
| var previous_reaction = active_reaction; | |
| var previous_sources = current_sources; | |
| var previous_component_context = component_context; | |
| var previous_untracking = untracking; | |
| var previous_update_version = update_version; | |
| var flags2 = reaction.f; | |
| new_deps = /** @type {null | Value[]} */ | |
| null; | |
| skipped_deps = 0; | |
| untracked_writes = null; | |
| active_reaction = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; | |
| current_sources = null; | |
| set_component_context(reaction.ctx); | |
| untracking = false; | |
| update_version = ++read_version; | |
| if (reaction.ac !== null) { | |
| without_reactive_context(() => { | |
| reaction.ac.abort(STALE_REACTION); | |
| }); | |
| reaction.ac = null; | |
| } | |
| try { | |
| reaction.f |= REACTION_IS_UPDATING; | |
| var fn = ( | |
| /** @type {Function} */ | |
| reaction.fn | |
| ); | |
| var result = fn(); | |
| reaction.f |= REACTION_RAN; | |
| var deps = reaction.deps; | |
| var is_fork = current_batch?.is_fork; | |
| if (new_deps !== null) { | |
| var i; | |
| if (!is_fork) { | |
| remove_reactions(reaction, skipped_deps); | |
| } | |
| if (deps !== null && skipped_deps > 0) { | |
| deps.length = skipped_deps + new_deps.length; | |
| for (i = 0; i < new_deps.length; i++) { | |
| deps[skipped_deps + i] = new_deps[i]; | |
| } | |
| } else { | |
| reaction.deps = deps = new_deps; | |
| } | |
| if (effect_tracking() && (reaction.f & CONNECTED) !== 0) { | |
| for (i = skipped_deps; i < deps.length; i++) { | |
| (deps[i].reactions ??= []).push(reaction); | |
| } | |
| } | |
| } else if (!is_fork && deps !== null && skipped_deps < deps.length) { | |
| remove_reactions(reaction, skipped_deps); | |
| deps.length = skipped_deps; | |
| } | |
| if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0) { | |
| for (i = 0; i < /** @type {Source[]} */ | |
| untracked_writes.length; i++) { | |
| schedule_possible_effect_self_invalidation( | |
| untracked_writes[i], | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| if (previous_reaction !== null && previous_reaction !== reaction) { | |
| read_version++; | |
| if (previous_reaction.deps !== null) { | |
| for (let i2 = 0; i2 < previous_skipped_deps; i2 += 1) { | |
| previous_reaction.deps[i2].rv = read_version; | |
| } | |
| } | |
| if (previous_deps !== null) { | |
| for (const dep of previous_deps) { | |
| dep.rv = read_version; | |
| } | |
| } | |
| if (untracked_writes !== null) { | |
| if (previous_untracked_writes === null) { | |
| previous_untracked_writes = untracked_writes; | |
| } else { | |
| previous_untracked_writes.push(.../** @type {Source[]} */ | |
| untracked_writes); | |
| } | |
| } | |
| } | |
| if ((reaction.f & ERROR_VALUE) !== 0) { | |
| reaction.f ^= ERROR_VALUE; | |
| } | |
| return result; | |
| } catch (error) { | |
| return handle_error(error); | |
| } finally { | |
| reaction.f ^= REACTION_IS_UPDATING; | |
| new_deps = previous_deps; | |
| skipped_deps = previous_skipped_deps; | |
| untracked_writes = previous_untracked_writes; | |
| active_reaction = previous_reaction; | |
| current_sources = previous_sources; | |
| set_component_context(previous_component_context); | |
| untracking = previous_untracking; | |
| update_version = previous_update_version; | |
| } | |
| } | |
| function remove_reaction(signal, dependency) { | |
| let reactions = dependency.reactions; | |
| if (reactions !== null) { | |
| var index = index_of.call(reactions, signal); | |
| if (index !== -1) { | |
| var new_length = reactions.length - 1; | |
| if (new_length === 0) { | |
| reactions = dependency.reactions = null; | |
| } else { | |
| reactions[index] = reactions[new_length]; | |
| reactions.pop(); | |
| } | |
| } | |
| } | |
| if (reactions === null && (dependency.f & DERIVED) !== 0 && // Destroying a child effect while updating a parent effect can cause a dependency to appear | |
| // to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps` | |
| // allows us to skip the expensive work of disconnecting and immediately reconnecting it | |
| (new_deps === null || !includes.call(new_deps, dependency))) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| if ((derived2.f & CONNECTED) !== 0) { | |
| derived2.f ^= CONNECTED; | |
| derived2.f &= ~WAS_MARKED; | |
| } | |
| if (derived2.v !== UNINITIALIZED) { | |
| update_derived_status(derived2); | |
| } | |
| freeze_derived_effects(derived2); | |
| remove_reactions(derived2, 0); | |
| } | |
| } | |
| function remove_reactions(signal, start_index) { | |
| var dependencies = signal.deps; | |
| if (dependencies === null) return; | |
| for (var i = start_index; i < dependencies.length; i++) { | |
| remove_reaction(signal, dependencies[i]); | |
| } | |
| } | |
| function update_effect(effect2) { | |
| var flags2 = effect2.f; | |
| if ((flags2 & DESTROYED) !== 0) { | |
| return; | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var previous_effect = active_effect; | |
| var was_updating_effect = is_updating_effect; | |
| active_effect = effect2; | |
| is_updating_effect = true; | |
| try { | |
| if ((flags2 & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) { | |
| destroy_block_effect_children(effect2); | |
| } else { | |
| destroy_effect_children(effect2); | |
| } | |
| execute_effect_teardown(effect2); | |
| var teardown2 = update_reaction(effect2); | |
| effect2.teardown = typeof teardown2 === "function" ? teardown2 : null; | |
| effect2.wv = write_version; | |
| var dep; | |
| if (DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) ; | |
| } finally { | |
| is_updating_effect = was_updating_effect; | |
| active_effect = previous_effect; | |
| } | |
| } | |
| async function tick() { | |
| await Promise.resolve(); | |
| flushSync(); | |
| } | |
| function get(signal) { | |
| var flags2 = signal.f; | |
| var is_derived = (flags2 & DERIVED) !== 0; | |
| if (active_reaction !== null && !untracking) { | |
| var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0; | |
| if (!destroyed && (current_sources === null || !includes.call(current_sources, signal))) { | |
| var deps = active_reaction.deps; | |
| if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { | |
| if (signal.rv < read_version) { | |
| signal.rv = read_version; | |
| if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { | |
| skipped_deps++; | |
| } else if (new_deps === null) { | |
| new_deps = [signal]; | |
| } else { | |
| new_deps.push(signal); | |
| } | |
| } | |
| } else { | |
| (active_reaction.deps ??= []).push(signal); | |
| var reactions = signal.reactions; | |
| if (reactions === null) { | |
| signal.reactions = [active_reaction]; | |
| } else if (!includes.call(reactions, active_reaction)) { | |
| reactions.push(active_reaction); | |
| } | |
| } | |
| } | |
| } | |
| if (is_destroying_effect && old_values.has(signal)) { | |
| return old_values.get(signal); | |
| } | |
| if (is_derived) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| signal | |
| ); | |
| if (is_destroying_effect) { | |
| var value = derived2.v; | |
| if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) { | |
| value = execute_derived(derived2); | |
| } | |
| old_values.set(derived2, value); | |
| return value; | |
| } | |
| var should_connect = (derived2.f & CONNECTED) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & CONNECTED) !== 0); | |
| var is_new = (derived2.f & REACTION_RAN) === 0; | |
| if (is_dirty(derived2)) { | |
| if (should_connect) { | |
| derived2.f |= CONNECTED; | |
| } | |
| update_derived(derived2); | |
| } | |
| if (should_connect && !is_new) { | |
| unfreeze_derived_effects(derived2); | |
| reconnect(derived2); | |
| } | |
| } | |
| if (batch_values?.has(signal)) { | |
| return batch_values.get(signal); | |
| } | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| throw signal.v; | |
| } | |
| return signal.v; | |
| } | |
| function reconnect(derived2) { | |
| derived2.f |= CONNECTED; | |
| if (derived2.deps === null) return; | |
| for (const dep of derived2.deps) { | |
| (dep.reactions ??= []).push(derived2); | |
| if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) { | |
| unfreeze_derived_effects( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| reconnect( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| } | |
| } | |
| } | |
| function depends_on_old_values(derived2) { | |
| if (derived2.v === UNINITIALIZED) return true; | |
| if (derived2.deps === null) return false; | |
| for (const dep of derived2.deps) { | |
| if (old_values.has(dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on_old_values( | |
| /** @type {Derived} */ | |
| dep | |
| )) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function validate_effect(rune) { | |
| if (active_effect === null) { | |
| if (active_reaction === null) { | |
| effect_orphan(); | |
| } | |
| effect_in_unowned_derived(); | |
| } | |
| if (is_destroying_effect) { | |
| effect_in_teardown(); | |
| } | |
| } | |
| function push_effect(effect2, parent_effect) { | |
| var parent_last = parent_effect.last; | |
| if (parent_last === null) { | |
| parent_effect.last = parent_effect.first = effect2; | |
| } else { | |
| parent_last.next = effect2; | |
| effect2.prev = parent_last; | |
| parent_effect.last = effect2; | |
| } | |
| } | |
| function create_effect(type, fn) { | |
| var parent = active_effect; | |
| if (parent !== null && (parent.f & INERT) !== 0) { | |
| type |= INERT; | |
| } | |
| var effect2 = { | |
| ctx: component_context, | |
| deps: null, | |
| nodes: null, | |
| f: type | DIRTY | CONNECTED, | |
| first: null, | |
| fn, | |
| last: null, | |
| next: null, | |
| parent, | |
| b: parent && parent.b, | |
| prev: null, | |
| teardown: null, | |
| wv: 0, | |
| ac: null | |
| }; | |
| current_batch?.register_created_effect(effect2); | |
| var e = effect2; | |
| if ((type & EFFECT) !== 0) { | |
| if (collected_effects !== null) { | |
| collected_effects.push(effect2); | |
| } else { | |
| Batch.ensure().schedule(effect2); | |
| } | |
| } else if (fn !== null) { | |
| try { | |
| update_effect(effect2); | |
| } catch (e2) { | |
| destroy_effect(effect2); | |
| throw e2; | |
| } | |
| if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && // either `null`, or a singular child | |
| (e.f & EFFECT_PRESERVED) === 0) { | |
| e = e.first; | |
| if ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) { | |
| e.f |= EFFECT_TRANSPARENT; | |
| } | |
| } | |
| } | |
| if (e !== null) { | |
| e.parent = parent; | |
| if (parent !== null) { | |
| push_effect(e, parent); | |
| } | |
| if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| active_reaction | |
| ); | |
| (derived2.effects ??= []).push(e); | |
| } | |
| } | |
| return effect2; | |
| } | |
| function effect_tracking() { | |
| return active_reaction !== null && !untracking; | |
| } | |
| function teardown(fn) { | |
| const effect2 = create_effect(RENDER_EFFECT, null); | |
| set_signal_status(effect2, CLEAN); | |
| effect2.teardown = fn; | |
| return effect2; | |
| } | |
| function user_effect(fn) { | |
| validate_effect(); | |
| var flags2 = ( | |
| /** @type {Effect} */ | |
| active_effect.f | |
| ); | |
| var defer = !active_reaction && (flags2 & BRANCH_EFFECT) !== 0 && (flags2 & REACTION_RAN) === 0; | |
| if (defer) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| (context.e ??= []).push(fn); | |
| } else { | |
| return create_user_effect(fn); | |
| } | |
| } | |
| function create_user_effect(fn) { | |
| return create_effect(EFFECT | USER_EFFECT, fn); | |
| } | |
| function effect_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return () => { | |
| destroy_effect(effect2); | |
| }; | |
| } | |
| function component_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return (options = {}) => { | |
| return new Promise((fulfil) => { | |
| if (options.outro) { | |
| pause_effect(effect2, () => { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| }); | |
| } else { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| } | |
| }); | |
| }; | |
| } | |
| function effect(fn) { | |
| return create_effect(EFFECT, fn); | |
| } | |
| function async_effect(fn) { | |
| return create_effect(ASYNC | EFFECT_PRESERVED, fn); | |
| } | |
| function render_effect(fn, flags2 = 0) { | |
| return create_effect(RENDER_EFFECT | flags2, fn); | |
| } | |
| function template_effect(fn, sync = [], async = [], blockers = []) { | |
| flatten(blockers, sync, async, (values) => { | |
| create_effect(RENDER_EFFECT, () => fn(...values.map(get))); | |
| }); | |
| } | |
| function block(fn, flags2 = 0) { | |
| var effect2 = create_effect(BLOCK_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function managed(fn, flags2 = 0) { | |
| var effect2 = create_effect(MANAGED_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function branch(fn) { | |
| return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn); | |
| } | |
| function execute_effect_teardown(effect2) { | |
| var teardown2 = effect2.teardown; | |
| if (teardown2 !== null) { | |
| const previously_destroying_effect = is_destroying_effect; | |
| const previous_reaction = active_reaction; | |
| set_is_destroying_effect(true); | |
| set_active_reaction(null); | |
| try { | |
| teardown2.call(null); | |
| } finally { | |
| set_is_destroying_effect(previously_destroying_effect); | |
| set_active_reaction(previous_reaction); | |
| } | |
| } | |
| } | |
| function destroy_effect_children(signal, remove_dom = false) { | |
| var effect2 = signal.first; | |
| signal.first = signal.last = null; | |
| while (effect2 !== null) { | |
| const controller = effect2.ac; | |
| if (controller !== null) { | |
| without_reactive_context(() => { | |
| controller.abort(STALE_REACTION); | |
| }); | |
| } | |
| var next2 = effect2.next; | |
| if ((effect2.f & ROOT_EFFECT) !== 0) { | |
| effect2.parent = null; | |
| } else { | |
| destroy_effect(effect2, remove_dom); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_block_effect_children(signal) { | |
| var effect2 = signal.first; | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if ((effect2.f & BRANCH_EFFECT) === 0) { | |
| destroy_effect(effect2); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_effect(effect2, remove_dom = true) { | |
| var removed = false; | |
| if ((remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes !== null && effect2.nodes.end !== null) { | |
| remove_effect_dom( | |
| effect2.nodes.start, | |
| /** @type {TemplateNode} */ | |
| effect2.nodes.end | |
| ); | |
| removed = true; | |
| } | |
| set_signal_status(effect2, DESTROYING); | |
| destroy_effect_children(effect2, remove_dom && !removed); | |
| remove_reactions(effect2, 0); | |
| var transitions = effect2.nodes && effect2.nodes.t; | |
| if (transitions !== null) { | |
| for (const transition of transitions) { | |
| transition.stop(); | |
| } | |
| } | |
| execute_effect_teardown(effect2); | |
| effect2.f ^= DESTROYING; | |
| effect2.f |= DESTROYED; | |
| var parent = effect2.parent; | |
| if (parent !== null && parent.first !== null) { | |
| unlink_effect(effect2); | |
| } | |
| effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes = effect2.ac = effect2.b = null; | |
| } | |
| function remove_effect_dom(node, end) { | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function unlink_effect(effect2) { | |
| var parent = effect2.parent; | |
| var prev = effect2.prev; | |
| var next2 = effect2.next; | |
| if (prev !== null) prev.next = next2; | |
| if (next2 !== null) next2.prev = prev; | |
| if (parent !== null) { | |
| if (parent.first === effect2) parent.first = next2; | |
| if (parent.last === effect2) parent.last = prev; | |
| } | |
| } | |
| function pause_effect(effect2, callback, destroy = true) { | |
| var transitions = []; | |
| pause_children(effect2, transitions, true); | |
| var fn = () => { | |
| if (destroy) destroy_effect(effect2); | |
| if (callback) callback(); | |
| }; | |
| var remaining = transitions.length; | |
| if (remaining > 0) { | |
| var check = () => --remaining || fn(); | |
| for (var transition of transitions) { | |
| transition.out(check); | |
| } | |
| } else { | |
| fn(); | |
| } | |
| } | |
| function pause_children(effect2, transitions, local) { | |
| if ((effect2.f & INERT) !== 0) return; | |
| effect2.f ^= INERT; | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transitions.push(transition); | |
| } | |
| } | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| if ((child2.f & ROOT_EFFECT) === 0) { | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || // If this is a branch effect without a block effect parent, | |
| // it means the parent block effect was pruned. In that case, | |
| // transparency information was transferred to the branch effect. | |
| (child2.f & BRANCH_EFFECT) !== 0 && (effect2.f & BLOCK_EFFECT) !== 0; | |
| pause_children(child2, transitions, transparent ? local : false); | |
| } | |
| child2 = sibling2; | |
| } | |
| } | |
| function resume_effect(effect2) { | |
| resume_children(effect2, true); | |
| } | |
| function resume_children(effect2, local) { | |
| if ((effect2.f & INERT) === 0) return; | |
| effect2.f ^= INERT; | |
| if ((effect2.f & CLEAN) === 0) { | |
| set_signal_status(effect2, DIRTY); | |
| Batch.ensure().schedule(effect2); | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; | |
| resume_children(child2, transparent ? local : false); | |
| child2 = sibling2; | |
| } | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transition.in(); | |
| } | |
| } | |
| } | |
| } | |
| function move_effect(effect2, fragment) { | |
| if (!effect2.nodes) return; | |
| var node = effect2.nodes.start; | |
| var end = effect2.nodes.end; | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| fragment.append(node); | |
| node = next2; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get$1(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get$1(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get$1(scope.store), name); | |
| } | |
| scope.store.set(get$1(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (official website)", | |
| cancel: "Cancel", | |
| enterCode: "Enter code", | |
| enterCodeAria: "Enter code you hear. Press Space to play audio.", | |
| enterCodeFromImage: "To proceed, please enter the code from the image below.", | |
| error: "Verification failed. Try again later.", | |
| expired: "Verification expired. Try again.", | |
| footer: 'Protected by <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (official website)">ALTCHA</a>', | |
| getAudioChallenge: "Get an audio challenge", | |
| label: "I'm not a robot", | |
| loading: "Loading...", | |
| reload: "Reload", | |
| verify: "Verify", | |
| verificationRequired: "Verification required!", | |
| verified: "Verified", | |
| verifying: "Verifying...", | |
| waitAlert: "Verifying... please wait." | |
| }; | |
| globalThis.$altcha.i18n.set("en", i18n); | |
| const PUBLIC_VERSION = "5"; | |
| if (typeof window !== "undefined") { | |
| ((window.__svelte ??= {}).v ??= /* @__PURE__ */ new Set()).add(PUBLIC_VERSION); | |
| } | |
| const event_symbol = /* @__PURE__ */ Symbol("events"); | |
| const all_registered_events = /* @__PURE__ */ new Set(); | |
| const root_event_handles = /* @__PURE__ */ new Set(); | |
| function create_event(event_name, dom, handler, options = {}) { | |
| function target_handler(event2) { | |
| if (!options.capture) { | |
| handle_event_propagation.call(dom, event2); | |
| } | |
| if (!event2.cancelBubble) { | |
| return without_reactive_context(() => { | |
| return handler?.call(this, event2); | |
| }); | |
| } | |
| } | |
| if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") { | |
| queue_micro_task(() => { | |
| dom.addEventListener(event_name, target_handler, options); | |
| }); | |
| } else { | |
| dom.addEventListener(event_name, target_handler, options); | |
| } | |
| return target_handler; | |
| } | |
| function event(event_name, dom, handler, capture2, passive) { | |
| var options = { capture: capture2, passive }; | |
| var target_handler = create_event(event_name, dom, handler, options); | |
| if (dom === document.body || // @ts-ignore | |
| dom === window || // @ts-ignore | |
| dom === document || // Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed | |
| dom instanceof HTMLMediaElement) { | |
| teardown(() => { | |
| dom.removeEventListener(event_name, target_handler, options); | |
| }); | |
| } | |
| } | |
| function delegated(event_name, element, handler) { | |
| (element[event_symbol] ??= {})[event_name] = handler; | |
| } | |
| function delegate(events) { | |
| for (var i = 0; i < events.length; i++) { | |
| all_registered_events.add(events[i]); | |
| } | |
| for (var fn of root_event_handles) { | |
| fn(events); | |
| } | |
| } | |
| let last_propagated_event = null; | |
| function handle_event_propagation(event2) { | |
| var handler_element = this; | |
| var owner_document = ( | |
| /** @type {Node} */ | |
| handler_element.ownerDocument | |
| ); | |
| var event_name = event2.type; | |
| var path = event2.composedPath?.() || []; | |
| var current_target = ( | |
| /** @type {null | Element} */ | |
| path[0] || event2.target | |
| ); | |
| last_propagated_event = event2; | |
| var path_idx = 0; | |
| var handled_at = last_propagated_event === event2 && event2[event_symbol]; | |
| if (handled_at) { | |
| var at_idx = path.indexOf(handled_at); | |
| if (at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ | |
| window)) { | |
| event2[event_symbol] = handler_element; | |
| return; | |
| } | |
| var handler_idx = path.indexOf(handler_element); | |
| if (handler_idx === -1) { | |
| return; | |
| } | |
| if (at_idx <= handler_idx) { | |
| path_idx = at_idx; | |
| } | |
| } | |
| current_target = /** @type {Element} */ | |
| path[path_idx] || event2.target; | |
| if (current_target === handler_element) return; | |
| define_property(event2, "currentTarget", { | |
| configurable: true, | |
| get() { | |
| return current_target || owner_document; | |
| } | |
| }); | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| var throw_error; | |
| var other_errors = []; | |
| while (current_target !== null) { | |
| var parent_element = current_target.assignedSlot || current_target.parentNode || /** @type {any} */ | |
| current_target.host || null; | |
| try { | |
| var delegated2 = current_target[event_symbol]?.[event_name]; | |
| if (delegated2 != null && (!/** @type {any} */ | |
| current_target.disabled || // DOM could've been updated already by the time this is reached, so we check this as well | |
| // -> the target could not have been disabled because it emits the event in the first place | |
| event2.target === current_target)) { | |
| delegated2.call(current_target, event2); | |
| } | |
| } catch (error) { | |
| if (throw_error) { | |
| other_errors.push(error); | |
| } else { | |
| throw_error = error; | |
| } | |
| } | |
| if (event2.cancelBubble || parent_element === handler_element || parent_element === null) { | |
| break; | |
| } | |
| current_target = parent_element; | |
| } | |
| if (throw_error) { | |
| for (let error of other_errors) { | |
| queueMicrotask(() => { | |
| throw error; | |
| }); | |
| } | |
| throw throw_error; | |
| } | |
| } finally { | |
| event2[event_symbol] = handler_element; | |
| delete event2.currentTarget; | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| const policy = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| globalThis?.window?.trustedTypes && /* @__PURE__ */ globalThis.window.trustedTypes.createPolicy("svelte-trusted-html", { | |
| /** @param {string} html */ | |
| createHTML: (html2) => { | |
| return html2; | |
| } | |
| }) | |
| ); | |
| function create_trusted_html(html2) { | |
| return ( | |
| /** @type {string} */ | |
| policy?.createHTML(html2) ?? html2 | |
| ); | |
| } | |
| function create_fragment_from_html(html2) { | |
| var elem = create_element("template"); | |
| elem.innerHTML = create_trusted_html(html2.replaceAll("<!>", "<!---->")); | |
| return elem.content; | |
| } | |
| function assign_nodes(start, end) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| if (effect2.nodes === null) { | |
| effect2.nodes = { start, end, a: null, t: null }; | |
| } | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_html(content, flags2) { | |
| var is_fragment = (flags2 & TEMPLATE_FRAGMENT) !== 0; | |
| var use_import_node = (flags2 & TEMPLATE_USE_IMPORT_NODE) !== 0; | |
| var node; | |
| var has_start = !content.startsWith("<!>"); | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (node === void 0) { | |
| node = create_fragment_from_html(has_start ? content : "<!>" + content); | |
| if (!is_fragment) node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(node); | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true) | |
| ); | |
| if (is_fragment) { | |
| var start = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(clone) | |
| ); | |
| var end = ( | |
| /** @type {TemplateNode} */ | |
| clone.lastChild | |
| ); | |
| assign_nodes(start, end); | |
| } else { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_namespace(content, flags2, ns = "svg") { | |
| var has_start = !content.startsWith("<!>"); | |
| var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`; | |
| var node; | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (!node) { | |
| var fragment = ( | |
| /** @type {DocumentFragment} */ | |
| create_fragment_from_html(wrapped) | |
| ); | |
| var root2 = ( | |
| /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(fragment) | |
| ); | |
| { | |
| node = /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(root2); | |
| } | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| node.cloneNode(true) | |
| ); | |
| { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_svg(content, flags2) { | |
| return /* @__PURE__ */ from_namespace(content, flags2, "svg"); | |
| } | |
| function text(value = "") { | |
| if (!hydrating) { | |
| var t = create_text(value + ""); | |
| assign_nodes(t, t); | |
| return t; | |
| } | |
| var node = hydrate_node; | |
| if (node.nodeType !== TEXT_NODE) { | |
| node.before(node = create_text()); | |
| set_hydrate_node(node); | |
| } else { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| node | |
| ); | |
| } | |
| assign_nodes(node, node); | |
| return node; | |
| } | |
| function comment() { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| var frag = document.createDocumentFragment(); | |
| var start = document.createComment(""); | |
| var anchor = create_text(); | |
| frag.append(start, anchor); | |
| assign_nodes(start, anchor); | |
| return frag; | |
| } | |
| function append(anchor, dom) { | |
| if (hydrating) { | |
| var effect2 = ( | |
| /** @type {Effect & { nodes: EffectNodes }} */ | |
| active_effect | |
| ); | |
| if ((effect2.f & REACTION_RAN) === 0 || effect2.nodes.end === null) { | |
| effect2.nodes.end = hydrate_node; | |
| } | |
| hydrate_next(); | |
| return; | |
| } | |
| if (anchor === null) { | |
| return; | |
| } | |
| anchor.before( | |
| /** @type {Node} */ | |
| dom | |
| ); | |
| } | |
| function is_capture_event(name) { | |
| return name.endsWith("capture") && name !== "gotpointercapture" && name !== "lostpointercapture"; | |
| } | |
| const DELEGATED_EVENTS = [ | |
| "beforeinput", | |
| "click", | |
| "change", | |
| "dblclick", | |
| "contextmenu", | |
| "focusin", | |
| "focusout", | |
| "input", | |
| "keydown", | |
| "keyup", | |
| "mousedown", | |
| "mousemove", | |
| "mouseout", | |
| "mouseover", | |
| "mouseup", | |
| "pointerdown", | |
| "pointermove", | |
| "pointerout", | |
| "pointerover", | |
| "pointerup", | |
| "touchend", | |
| "touchmove", | |
| "touchstart" | |
| ]; | |
| function can_delegate_event(event_name) { | |
| return DELEGATED_EVENTS.includes(event_name); | |
| } | |
| const ATTRIBUTE_ALIASES = { | |
| // no `class: 'className'` because we handle that separately | |
| formnovalidate: "formNoValidate", | |
| ismap: "isMap", | |
| nomodule: "noModule", | |
| playsinline: "playsInline", | |
| readonly: "readOnly", | |
| defaultvalue: "defaultValue", | |
| defaultchecked: "defaultChecked", | |
| srcobject: "srcObject", | |
| novalidate: "noValidate", | |
| allowfullscreen: "allowFullscreen", | |
| disablepictureinpicture: "disablePictureInPicture", | |
| disableremoteplayback: "disableRemotePlayback" | |
| }; | |
| function normalize_attribute(name) { | |
| name = name.toLowerCase(); | |
| return ATTRIBUTE_ALIASES[name] ?? name; | |
| } | |
| const PASSIVE_EVENTS = ["touchstart", "touchmove"]; | |
| function is_passive_event(name) { | |
| return PASSIVE_EVENTS.includes(name); | |
| } | |
| function set_text(text2, value) { | |
| var str = value == null ? "" : typeof value === "object" ? `${value}` : value; | |
| if (str !== /** @type {any} */ | |
| (text2[TEXT_CACHE] ??= text2.nodeValue)) { | |
| text2[TEXT_CACHE] = str; | |
| text2.nodeValue = `${str}`; | |
| } | |
| } | |
| function mount(component2, options) { | |
| return _mount(component2, options); | |
| } | |
| function hydrate(component2, options) { | |
| init_operations(); | |
| options.intro = options.intro ?? false; | |
| const target = options.target; | |
| const was_hydrating = hydrating; | |
| const previous_hydrate_node = hydrate_node; | |
| try { | |
| var anchor = /* @__PURE__ */ get_first_child(target); | |
| while (anchor && (anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| anchor.data !== HYDRATION_START)) { | |
| anchor = /* @__PURE__ */ get_next_sibling(anchor); | |
| } | |
| if (!anchor) { | |
| throw HYDRATION_ERROR; | |
| } | |
| set_hydrating(true); | |
| set_hydrate_node( | |
| /** @type {Comment} */ | |
| anchor | |
| ); | |
| const instance = _mount(component2, { ...options, anchor }); | |
| set_hydrating(false); | |
| return ( | |
| /** @type {Exports} */ | |
| instance | |
| ); | |
| } catch (error) { | |
| if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) { | |
| throw error; | |
| } | |
| if (error !== HYDRATION_ERROR) { | |
| console.warn("Failed to hydrate: ", error); | |
| } | |
| if (options.recover === false) { | |
| hydration_failed(); | |
| } | |
| init_operations(); | |
| clear_text_content(target); | |
| set_hydrating(false); | |
| return mount(component2, options); | |
| } finally { | |
| set_hydrating(was_hydrating); | |
| set_hydrate_node(previous_hydrate_node); | |
| } | |
| } | |
| const listeners = /* @__PURE__ */ new Map(); | |
| function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) { | |
| init_operations(); | |
| var component2 = void 0; | |
| var unmount2 = component_root(() => { | |
| var anchor_node = anchor ?? target.appendChild(create_text()); | |
| boundary( | |
| /** @type {TemplateNode} */ | |
| anchor_node, | |
| { | |
| pending: () => { | |
| } | |
| }, | |
| (anchor_node2) => { | |
| push({}); | |
| var ctx = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| if (context) ctx.c = context; | |
| if (events) { | |
| props.$$events = events; | |
| } | |
| if (hydrating) { | |
| assign_nodes( | |
| /** @type {TemplateNode} */ | |
| anchor_node2, | |
| null | |
| ); | |
| } | |
| component2 = Component(anchor_node2, props) || {}; | |
| if (hydrating) { | |
| active_effect.nodes.end = hydrate_node; | |
| if (hydrate_node === null || hydrate_node.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| hydrate_node.data !== HYDRATION_END) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| } | |
| pop(); | |
| }, | |
| transformError | |
| ); | |
| var registered_events = /* @__PURE__ */ new Set(); | |
| var event_handle = (events2) => { | |
| for (var i = 0; i < events2.length; i++) { | |
| var event_name = events2[i]; | |
| if (registered_events.has(event_name)) continue; | |
| registered_events.add(event_name); | |
| var passive = is_passive_event(event_name); | |
| for (const node of [target, document]) { | |
| var counts = listeners.get(node); | |
| if (counts === void 0) { | |
| counts = /* @__PURE__ */ new Map(); | |
| listeners.set(node, counts); | |
| } | |
| var count = counts.get(event_name); | |
| if (count === void 0) { | |
| node.addEventListener(event_name, handle_event_propagation, { passive }); | |
| counts.set(event_name, 1); | |
| } else { | |
| counts.set(event_name, count + 1); | |
| } | |
| } | |
| } | |
| }; | |
| event_handle(array_from(all_registered_events)); | |
| root_event_handles.add(event_handle); | |
| return () => { | |
| for (var event_name of registered_events) { | |
| for (const node of [target, document]) { | |
| var counts = ( | |
| /** @type {Map<string, number>} */ | |
| listeners.get(node) | |
| ); | |
| var count = ( | |
| /** @type {number} */ | |
| counts.get(event_name) | |
| ); | |
| if (--count == 0) { | |
| node.removeEventListener(event_name, handle_event_propagation); | |
| counts.delete(event_name); | |
| if (counts.size === 0) { | |
| listeners.delete(node); | |
| } | |
| } else { | |
| counts.set(event_name, count); | |
| } | |
| } | |
| } | |
| root_event_handles.delete(event_handle); | |
| if (anchor_node !== anchor) { | |
| anchor_node.parentNode?.removeChild(anchor_node); | |
| } | |
| }; | |
| }); | |
| mounted_components.set(component2, unmount2); | |
| return component2; | |
| } | |
| let mounted_components = /* @__PURE__ */ new WeakMap(); | |
| function unmount(component2, options) { | |
| const fn = mounted_components.get(component2); | |
| if (fn) { | |
| mounted_components.delete(component2); | |
| return fn(options); | |
| } | |
| return Promise.resolve(); | |
| } | |
| class BranchManager { | |
| /** @type {TemplateNode} */ | |
| anchor; | |
| /** @type {Map<Batch, Key>} */ | |
| #batches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Map of keys to effects that are currently rendered in the DOM. | |
| * These effects are visible and actively part of the document tree. | |
| * Example: | |
| * |
변경 전i18n.js
변경 후i18n.js
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
변경 전gd_board_goods.js
| $(document).ready(function () { | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| $(document).ready(function () { | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
변경 후gd_board_goods.js
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function loadAltchaModule() { | |
| if (window.gdAltchaModuleLoaded) { | |
| return; | |
| } | |
| const wrap = document.querySelector('.capcha_altcha[data-altcha-src]'); | |
| if (!wrap) { | |
| return; | |
| } | |
| window.gdAltchaModuleLoaded = true; | |
| const src = wrap.getAttribute('data-altcha-src'); | |
| [src, src.replace('altcha.js', 'i18n.js')].forEach(function (url) { | |
| const script = document.createElement('script'); | |
| script.type = 'module'; | |
| script.src = url; | |
| document.head.appendChild(script); | |
| }); | |
| } | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| loadAltchaModule(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/memo_ps.php", | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| }; | |
| function loadAltchaModule() { | |
| if (window.gdAltchaModuleLoaded) { | |
| return; | |
| } | |
| const wrap = document.querySelector('.capcha_altcha[data-altcha-src]'); | |
| if (!wrap) { | |
| return; | |
| } | |
| window.gdAltchaModuleLoaded = true; | |
| const src = wrap.getAttribute('data-altcha-src'); | |
| [src, src.replace('altcha.js', 'i18n.js')].forEach(function (url) { | |
| const script = document.createElement('script'); | |
| script.type = 'module'; | |
| script.src = url; | |
| document.head.appendChild(script); | |
| }); | |
| } | |
| function gd_open_write_layer(bdId, goodsNo, sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| gd_center_layer(); | |
| loadAltchaModule(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
변경 전gd_board_view.js
| */ | |
| $(document).ready(function () { | |
| $('img.js_smart_img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| writerPw: commentFormAction.password.val(), | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val() | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| */ | |
| $(document).ready(function () { | |
| $('img.js_smart_img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| writerPw: commentFormAction.password.val(), | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val() | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 후gd_board_view.js
| */ | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| $('img.js_smart_img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| writerPw: commentFormAction.password.val(), | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| */ | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| $('img.js_smart_img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| writerPw: commentFormAction.password.val(), | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 전gd_board_write.js
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $.validator.addMethod("checkCaptcha", function (value, element, fl) { | |
| var success = false; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'captcha', 'captchaKey': value }, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| if (result == 'true') { | |
| success = true; | |
| } | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| return success; | |
| }, __("자동등록방지 문자가 틀렸습니다.")); | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: { | |
| required: true, | |
| checkCaptcha : true, | |
| }, | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $.validator.addMethod("checkCaptcha", function (value, element, fl) { | |
| var success = false; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'captcha', 'captchaKey': value }, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| if (result == 'true') { | |
| success = true; | |
| } | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| return success; | |
| }, __("자동등록방지 문자가 틀렸습니다.")); | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: { | |
| required: true, | |
| checkCaptcha : true, | |
| }, | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
변경 후gd_board_write.js
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| if ($('.file_upload_sec').length > 10) { | |
| $('.file_upload_sec:last').remove(); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name="uploadType"]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
변경 전gd_common.js
| /** | |
| * 프레임 리사이즈 | |
| */ | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = (obj).contentWindow.document.body.clientHeight; | |
| (obj).height = iframeHeight + 80; | |
변경 후gd_common.js
| /** | |
| * 프레임 리사이즈 | |
| */ | |
| /* iframe(mypage 등)으로 board 목록이 실릴 때, onload 1회 측정(resize_frame/gd_resize_frame) 이후에도 | |
| 댓글/답글 폼 토글, ALTCHA 위젯 지연 렌더, 댓글 등록/삭제 등으로 내용 높이가 바뀌면 | |
| 부모 iframe 높이를 다시 맞춘다. body 높이가 실제로 변했을 때만 호출해 재측정 루프를 방지. */ | |
| (function () { | |
| let parentResize; | |
| try { | |
| if (window.parent === window) { | |
| return; // 최상위 문서 → 대상 아님 | |
| } | |
| parentResize = window.parent.gd_resize_frame || window.parent.resize_frame; | |
| } catch (e) { | |
| return; // cross-origin 부모 → 접근 불가, 대상 아님 | |
| } | |
| if (typeof parentResize !== 'function' || typeof window.ResizeObserver === 'undefined') { | |
| return; | |
| } | |
| const startObserve = function () { | |
| const frameEl = window.frameElement | |
| || (window.name ? window.parent.document.getElementsByName(window.name)[0] : null); | |
| if (!frameEl || !document.body) { | |
| return; | |
| } | |
| let timer = null; | |
| let lastHeight = -1; | |
| const observer = new ResizeObserver(function () { | |
| if (timer) { | |
| clearTimeout(timer); | |
| } | |
| timer = setTimeout(function () { | |
| const height = document.body.clientHeight; | |
| if (height === lastHeight) { | |
| return; // 실제 콘텐츠 높이 변화 없음 → 재측정 루프 방지 | |
| } | |
| lastHeight = height; | |
| parentResize.call(window.parent, frameEl); | |
| }, 100); | |
| }); | |
| observer.observe(document.body); | |
| }; | |
| if (document.body) { | |
| startObserve(); | |
| } else { | |
| document.addEventListener('DOMContentLoaded', startObserve); | |
| } | |
| })(); | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = (obj).contentWindow.document.body.clientHeight; | |
| (obj).height = iframeHeight + 80; | |
변경 전gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
변경 후gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $('.js_btn_join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
변경 전join.html
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
변경 후join.html
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| <!-- //join_base_wrap --> | |
| </div> | |
| <!-- //content_box --> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
변경 전_join_view_captcha.html
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" id="reload_captcha"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/> | |
| </div> | |
| <div class="capcha_txt"> | |
| <p>{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"/> | |
| <span class="btn_gray_list"> | |
| <button type="button" class="btn_gray_small" id="reload_captcha"> | |
| <span><img src="../img/etc/icon_reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</span> | |
| </button> | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
변경 후_join_view_captcha.html
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </td> | |
| </tr> | |
| <th><span>{=__('자동등록방지')}</span></th> | |
| <td> | |
| <div class="member_warning"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </td> | |
| </tr> | |
변경 전_altcha.html
변경 후_altcha.html
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Front\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼(goods_board_write)에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Front\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼(goods_board_write)에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
변경 전popup_goods_board_write.html
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y'}--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y'}--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
변경 후popup_goods_board_write.html
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y'}--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| } | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{ ? bdWrite.cfg.bdEditorFl == 'y'}--> | |
| <script type="text/javascript"> | |
| var editorPath = '{=c.PATH_SKIN}js/smart'; | |
변경 전view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm comment-save js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm comment-save js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm comment-save js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm comment-save js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="comment-save skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="comment-save skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="comment-save skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="comment-save skinbtn base1 boardview-confirm js-comment-btn-write"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small2 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small2 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small2 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small2 captchareload"><em><img | |
| src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 후write.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| select_email_domain('writerEmail'); | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/template" class="template"> | |
| <div class="file-upload" style="margin-top:5px"> | |
| <label for="attach<%=idx%>"><input type="text" class="text" title="{=__('파일 첨부하기')}" readonly="readonly"/></label> | |
변경 전gd_contents.css
| float:left; | |
| } | |
| .board-view-comment .comment-wrap .text { | |
| height:31px; | |
| padding:0 10px; | |
변경 후gd_contents.css
| float:left; | |
| } | |
| /* ALTCHA 위젯 래퍼는 float(위 .comment-write > div / 아래 .comment-reply > div)에서 제외. | |
| 로봇 확인 후 라벨이 '확인됨'으로 축소될 때 확인 버튼(float:right) 옆/아래로 파고들어 | |
| 레이아웃이 틀어지는 문제 방지. clear:both 로 앞선 float 아래 새 줄에 고정한다. */ | |
| .comment-wrap .comment-write > div:has(.capcha_altcha), | |
| .comment-wrap > ul > li .comment-reply > div:has(.capcha_altcha) { | |
| clear:both; | |
| } | |
| .board-view-comment .comment-wrap .text { | |
| height:31px; | |
| padding:0 10px; | |
변경 전gd_goods-view.css
| cursor: text; | |
| } | |
| .review-board td .comment-wrap .text { | |
| height: 31px; | |
| padding: 0 10px; | |
변경 후gd_goods-view.css
| cursor: text; | |
| } | |
| /* ALTCHA 위젯은 light DOM 이라 위 placeholder label 규칙이 위젯 내부 label 까지 잡음. 위젯 컨테이너 안 label 만 흐름 복원 (댓글쓰기/답글 공통). */ | |
| .review-board td .comment-wrap .comment-write .capcha_altcha label, | |
| .review-board td .comment-wrap .comment-reply .capcha_altcha label { | |
| position: static; | |
| top: auto; | |
| left: auto; | |
| color: inherit; | |
| cursor: pointer; | |
| } | |
| .review-board td .comment-wrap .text { | |
| height: 31px; | |
| padding: 0 10px; | |
변경 전goods_board_review_view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action goods-comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha" style="margin-top: 10px;"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <div class="comment-save-btn"><a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write goods-comment-save"><em>{=__('확인')}</em></a></div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha" style="margin-top: 10px"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action goods-comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha" style="margin-top: 10px;"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <div class="comment-save-btn"><a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write goods-comment-save"><em>{=__('확인')}</em></a></div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="capcha" style="margin-top: 10px"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px; padding-left: 0; padding-bottom: 5px; border: none;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
변경 후goods_board_review_view.html
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action goods-comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <div class="comment-save-btn"><a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write goods-comment-save"><em>{=__('확인')}</em></a></div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-action goods-comment-save"><em>{=__('확인')}</em></a> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
| <!--{/}--> | |
| <div class="comment-save-btn"><a href="javascript:void(0)" class="skinbtn base1 boardview-confirm js-comment-btn-write goods-comment-save"><em>{=__('확인')}</em></a></div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{/}--> | |
| <!--{ ? !gd_is_login() }--> | |
변경 전goods_board_write.html
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php?ch={=time()}" align="absmiddle" id="captchaImg"/> | |
| <!--<img src="../../img/etc/@capcha-img.png" alt="">--> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" | |
| onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"><em><img | |
| src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
변경 후goods_board_write.html
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php', 'altchaSrc', 'y')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
| <tr> | |
| <th>{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php', 'altchaSrc', 'y')} | |
| </td> | |
| </tr> | |
| <!--{/}--> | |
변경 전goods_view.html
| </div> | |
| <!--//찜리스트 레이어 --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
| </div> | |
| <!--//찜리스트 레이어 --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
변경 후goods_view.html
| </div> | |
| <!--//찜리스트 레이어 --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
| </div> | |
| <!--//찜리스트 레이어 --> | |
| <script type="text/javascript" src="\{=c.PATH_SKIN}js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| { # footer } | |
변경 전altcha.js
변경 후altcha.js
| const DEV = false; | |
| var is_array = Array.isArray; | |
| var index_of = Array.prototype.indexOf; | |
| var includes = Array.prototype.includes; | |
| var array_from = Array.from; | |
| var object_keys = Object.keys; | |
| var define_property = Object.defineProperty; | |
| var get_descriptor = Object.getOwnPropertyDescriptor; | |
| var get_descriptors = Object.getOwnPropertyDescriptors; | |
| var object_prototype = Object.prototype; | |
| var array_prototype = Array.prototype; | |
| var get_prototype_of = Object.getPrototypeOf; | |
| var is_extensible = Object.isExtensible; | |
| const noop = () => { | |
| }; | |
| function run_all(arr) { | |
| for (var i = 0; i < arr.length; i++) { | |
| arr[i](); | |
| } | |
| } | |
| function deferred() { | |
| var resolve; | |
| var reject; | |
| var promise = new Promise((res, rej) => { | |
| resolve = res; | |
| reject = rej; | |
| }); | |
| return { promise, resolve, reject }; | |
| } | |
| const DERIVED = 1 << 1; | |
| const EFFECT = 1 << 2; | |
| const RENDER_EFFECT = 1 << 3; | |
| const MANAGED_EFFECT = 1 << 24; | |
| const BLOCK_EFFECT = 1 << 4; | |
| const BRANCH_EFFECT = 1 << 5; | |
| const ROOT_EFFECT = 1 << 6; | |
| const BOUNDARY_EFFECT = 1 << 7; | |
| const CONNECTED = 1 << 9; | |
| const CLEAN = 1 << 10; | |
| const DIRTY = 1 << 11; | |
| const MAYBE_DIRTY = 1 << 12; | |
| const INERT = 1 << 13; | |
| const DESTROYED = 1 << 14; | |
| const REACTION_RAN = 1 << 15; | |
| const DESTROYING = 1 << 25; | |
| const EFFECT_TRANSPARENT = 1 << 16; | |
| const EAGER_EFFECT = 1 << 17; | |
| const HEAD_EFFECT = 1 << 18; | |
| const EFFECT_PRESERVED = 1 << 19; | |
| const USER_EFFECT = 1 << 20; | |
| const WAS_MARKED = 1 << 16; | |
| const REACTION_IS_UPDATING = 1 << 21; | |
| const ASYNC = 1 << 22; | |
| const ERROR_VALUE = 1 << 23; | |
| const STATE_SYMBOL = /* @__PURE__ */ Symbol("$state"); | |
| const LEGACY_PROPS = /* @__PURE__ */ Symbol("legacy props"); | |
| const LOADING_ATTR_SYMBOL = /* @__PURE__ */ Symbol(""); | |
| const ATTRIBUTES_CACHE = /* @__PURE__ */ Symbol("attributes"); | |
| const CLASS_CACHE = /* @__PURE__ */ Symbol("class"); | |
| const STYLE_CACHE = /* @__PURE__ */ Symbol("style"); | |
| const TEXT_CACHE = /* @__PURE__ */ Symbol("text"); | |
| const FORM_RESET_HANDLER = /* @__PURE__ */ Symbol("form reset"); | |
| const STALE_REACTION = new class StaleReactionError extends Error { | |
| name = "StaleReactionError"; | |
| message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; | |
| }(); | |
| const IS_XHTML = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| !!globalThis.document?.contentType && /* @__PURE__ */ globalThis.document.contentType.includes("xml") | |
| ); | |
| const TEXT_NODE = 3; | |
| const COMMENT_NODE = 8; | |
| function equals(value) { | |
| return value === this.v; | |
| } | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function safe_equals(value) { | |
| return !safe_not_equal(value, this.v); | |
| } | |
| function lifecycle_outside_component(name) { | |
| { | |
| throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); | |
| } | |
| } | |
| function async_derived_orphan() { | |
| { | |
| throw new Error(`https://svelte.dev/e/async_derived_orphan`); | |
| } | |
| } | |
| function effect_in_teardown(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_teardown`); | |
| } | |
| } | |
| function effect_in_unowned_derived() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); | |
| } | |
| } | |
| function effect_orphan(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_orphan`); | |
| } | |
| } | |
| function effect_update_depth_exceeded() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); | |
| } | |
| } | |
| function hydration_failed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/hydration_failed`); | |
| } | |
| } | |
| function state_descriptors_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); | |
| } | |
| } | |
| function state_prototype_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_prototype_fixed`); | |
| } | |
| } | |
| function state_unsafe_mutation() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); | |
| } | |
| } | |
| function svelte_boundary_reset_onerror() { | |
| { | |
| throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); | |
| } | |
| } | |
| let tracing_mode_flag = false; | |
| const TEMPLATE_FRAGMENT = 1; | |
| const TEMPLATE_USE_IMPORT_NODE = 1 << 1; | |
| const HYDRATION_START = "["; | |
| const HYDRATION_START_ELSE = "[!"; | |
| const HYDRATION_START_FAILED = "[?"; | |
| const HYDRATION_END = "]"; | |
| const HYDRATION_ERROR = {}; | |
| const UNINITIALIZED = /* @__PURE__ */ Symbol("uninitialized"); | |
| const NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; | |
| const NAMESPACE_SVG = "http://www.w3.org/2000/svg"; | |
| const NAMESPACE_MATHML = "http://www.w3.org/1998/Math/MathML"; | |
| const ATTACHMENT_KEY = "@attach"; | |
| let component_context = null; | |
| function set_component_context(context) { | |
| component_context = context; | |
| } | |
| function push(props, runes = false, fn) { | |
| component_context = { | |
| p: component_context, | |
| i: false, | |
| c: null, | |
| e: null, | |
| s: props, | |
| x: null, | |
| r: ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ), | |
| l: null | |
| }; | |
| } | |
| function pop(component2) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| var effects = context.e; | |
| if (effects !== null) { | |
| context.e = null; | |
| for (var fn of effects) { | |
| create_user_effect(fn); | |
| } | |
| } | |
| if (component2 !== void 0) { | |
| context.x = component2; | |
| } | |
| context.i = true; | |
| component_context = context.p; | |
| return component2 ?? /** @type {T} */ | |
| {}; | |
| } | |
| function is_runes() { | |
| return true; | |
| } | |
| let micro_tasks = []; | |
| function run_micro_tasks() { | |
| var tasks = micro_tasks; | |
| micro_tasks = []; | |
| run_all(tasks); | |
| } | |
| function queue_micro_task(fn) { | |
| if (micro_tasks.length === 0 && !is_flushing_sync) { | |
| var tasks = micro_tasks; | |
| queueMicrotask(() => { | |
| if (tasks === micro_tasks) run_micro_tasks(); | |
| }); | |
| } | |
| micro_tasks.push(fn); | |
| } | |
| function flush_tasks() { | |
| while (micro_tasks.length > 0) { | |
| run_micro_tasks(); | |
| } | |
| } | |
| function derived_inert() { | |
| { | |
| console.warn(`https://svelte.dev/e/derived_inert`); | |
| } | |
| } | |
| function hydration_mismatch(location2) { | |
| { | |
| console.warn(`https://svelte.dev/e/hydration_mismatch`); | |
| } | |
| } | |
| function select_multiple_invalid_value() { | |
| { | |
| console.warn(`https://svelte.dev/e/select_multiple_invalid_value`); | |
| } | |
| } | |
| function svelte_boundary_reset_noop() { | |
| { | |
| console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`); | |
| } | |
| } | |
| let hydrating = false; | |
| function set_hydrating(value) { | |
| hydrating = value; | |
| } | |
| let hydrate_node; | |
| function set_hydrate_node(node) { | |
| if (node === null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return hydrate_node = node; | |
| } | |
| function hydrate_next() { | |
| return set_hydrate_node(/* @__PURE__ */ get_next_sibling(hydrate_node)); | |
| } | |
| function reset(node) { | |
| if (!hydrating) return; | |
| if (/* @__PURE__ */ get_next_sibling(hydrate_node) !== null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| hydrate_node = node; | |
| } | |
| function next(count = 1) { | |
| if (hydrating) { | |
| var i = count; | |
| var node = hydrate_node; | |
| while (i--) { | |
| node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node); | |
| } | |
| hydrate_node = node; | |
| } | |
| } | |
| function skip_nodes(remove = true) { | |
| var depth = 0; | |
| var node = hydrate_node; | |
| while (true) { | |
| if (node.nodeType === COMMENT_NODE) { | |
| var data = ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| if (data === HYDRATION_END) { | |
| if (depth === 0) return node; | |
| depth -= 1; | |
| } else if (data === HYDRATION_START || data === HYDRATION_START_ELSE || // "[1", "[2", etc. for if blocks | |
| data[0] === "[" && !isNaN(Number(data.slice(1)))) { | |
| depth += 1; | |
| } | |
| } | |
| var next2 = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node) | |
| ); | |
| if (remove) node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function read_hydration_instruction(node) { | |
| if (!node || node.nodeType !== COMMENT_NODE) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| } | |
| function proxy(value) { | |
| if (typeof value !== "object" || value === null || STATE_SYMBOL in value) { | |
| return value; | |
| } | |
| const prototype = get_prototype_of(value); | |
| if (prototype !== object_prototype && prototype !== array_prototype) { | |
| return value; | |
| } | |
| var sources = /* @__PURE__ */ new Map(); | |
| var is_proxied_array = is_array(value); | |
| var version = /* @__PURE__ */ state(0); | |
| var parent_version = update_version; | |
| var with_parent = (fn) => { | |
| if (update_version === parent_version) { | |
| return fn(); | |
| } | |
| var reaction = active_reaction; | |
| var version2 = update_version; | |
| set_active_reaction(null); | |
| set_update_version(parent_version); | |
| var result = fn(); | |
| set_active_reaction(reaction); | |
| set_update_version(version2); | |
| return result; | |
| }; | |
| if (is_proxied_array) { | |
| sources.set("length", /* @__PURE__ */ state( | |
| /** @type {any[]} */ | |
| value.length | |
| )); | |
| } | |
| return new Proxy( | |
| /** @type {any} */ | |
| value, | |
| { | |
| defineProperty(_, prop2, descriptor) { | |
| if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) { | |
| state_descriptors_fixed(); | |
| } | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| with_parent(() => { | |
| var s2 = /* @__PURE__ */ state(descriptor.value); | |
| sources.set(prop2, s2); | |
| return s2; | |
| }); | |
| } else { | |
| set(s, descriptor.value, true); | |
| } | |
| return true; | |
| }, | |
| deleteProperty(target, prop2) { | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| if (prop2 in target) { | |
| const s2 = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(prop2, s2); | |
| increment(version); | |
| } | |
| } else { | |
| set(s, UNINITIALIZED); | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| get(target, prop2, receiver) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return value; | |
| } | |
| var s = sources.get(prop2); | |
| var exists = prop2 in target; | |
| if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) { | |
| s = with_parent(() => { | |
| var p = proxy(exists ? target[prop2] : UNINITIALIZED); | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| if (s !== void 0) { | |
| var v = get(s); | |
| return v === UNINITIALIZED ? void 0 : v; | |
| } | |
| return Reflect.get(target, prop2, receiver); | |
| }, | |
| getOwnPropertyDescriptor(target, prop2) { | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor && "value" in descriptor) { | |
| var s = sources.get(prop2); | |
| if (s) descriptor.value = get(s); | |
| } else if (descriptor === void 0) { | |
| var source2 = sources.get(prop2); | |
| var value2 = source2?.v; | |
| if (source2 !== void 0 && value2 !== UNINITIALIZED) { | |
| return { | |
| enumerable: true, | |
| configurable: true, | |
| value: value2, | |
| writable: true | |
| }; | |
| } | |
| } | |
| return descriptor; | |
| }, | |
| has(target, prop2) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return true; | |
| } | |
| var s = sources.get(prop2); | |
| var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2); | |
| if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) { | |
| if (s === void 0) { | |
| s = with_parent(() => { | |
| var p = has ? proxy(target[prop2]) : UNINITIALIZED; | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| var value2 = get(s); | |
| if (value2 === UNINITIALIZED) { | |
| return false; | |
| } | |
| } | |
| return has; | |
| }, | |
| set(target, prop2, value2, receiver) { | |
| var s = sources.get(prop2); | |
| var has = prop2 in target; | |
| if (is_proxied_array && prop2 === "length") { | |
| for (var i = value2; i < /** @type {Source<number>} */ | |
| s.v; i += 1) { | |
| var other_s = sources.get(i + ""); | |
| if (other_s !== void 0) { | |
| set(other_s, UNINITIALIZED); | |
| } else if (i in target) { | |
| other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(i + "", other_s); | |
| } | |
| } | |
| } | |
| if (s === void 0) { | |
| if (!has || get_descriptor(target, prop2)?.writable) { | |
| s = with_parent(() => /* @__PURE__ */ state(void 0)); | |
| set(s, proxy(value2)); | |
| sources.set(prop2, s); | |
| } | |
| } else { | |
| has = s.v !== UNINITIALIZED; | |
| var p = with_parent(() => proxy(value2)); | |
| set(s, p); | |
| } | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor?.set) { | |
| descriptor.set.call(receiver, value2); | |
| } | |
| if (!has) { | |
| if (is_proxied_array && typeof prop2 === "string") { | |
| var ls = ( | |
| /** @type {Source<number>} */ | |
| sources.get("length") | |
| ); | |
| var n = Number(prop2); | |
| if (Number.isInteger(n) && n >= ls.v) { | |
| set(ls, n + 1); | |
| } | |
| } | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| ownKeys(target) { | |
| get(version); | |
| var own_keys = Reflect.ownKeys(target).filter((key3) => { | |
| var source3 = sources.get(key3); | |
| return source3 === void 0 || source3.v !== UNINITIALIZED; | |
| }); | |
| for (var [key2, source2] of sources) { | |
| if (source2.v !== UNINITIALIZED && !(key2 in target)) { | |
| own_keys.push(key2); | |
| } | |
| } | |
| return own_keys; | |
| }, | |
| setPrototypeOf() { | |
| state_prototype_fixed(); | |
| } | |
| } | |
| ); | |
| } | |
| function get_proxied_value(value) { | |
| try { | |
| if (value !== null && typeof value === "object" && STATE_SYMBOL in value) { | |
| return value[STATE_SYMBOL]; | |
| } | |
| } catch { | |
| } | |
| return value; | |
| } | |
| function is(a, b) { | |
| return Object.is(get_proxied_value(a), get_proxied_value(b)); | |
| } | |
| var $window; | |
| var $document; | |
| var is_firefox; | |
| var first_child_getter; | |
| var next_sibling_getter; | |
| function init_operations() { | |
| if ($window !== void 0) { | |
| return; | |
| } | |
| $window = window; | |
| $document = document; | |
| is_firefox = /Firefox/.test(navigator.userAgent); | |
| var element_prototype = Element.prototype; | |
| var node_prototype = Node.prototype; | |
| var text_prototype = Text.prototype; | |
| first_child_getter = get_descriptor(node_prototype, "firstChild").get; | |
| next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; | |
| if (is_extensible(element_prototype)) { | |
| element_prototype[CLASS_CACHE] = void 0; | |
| element_prototype[ATTRIBUTES_CACHE] = null; | |
| element_prototype[STYLE_CACHE] = void 0; | |
| element_prototype.__e = void 0; | |
| } | |
| if (is_extensible(text_prototype)) { | |
| text_prototype[TEXT_CACHE] = void 0; | |
| } | |
| } | |
| function create_text(value = "") { | |
| return document.createTextNode(value); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_first_child(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| first_child_getter.call(node) | |
| ); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_next_sibling(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| next_sibling_getter.call(node) | |
| ); | |
| } | |
| function child(node, is_text) { | |
| if (!hydrating) { | |
| return /* @__PURE__ */ get_first_child(node); | |
| } | |
| var child2 = /* @__PURE__ */ get_first_child(hydrate_node); | |
| if (child2 === null) { | |
| child2 = hydrate_node.appendChild(create_text()); | |
| } else if (is_text && child2.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| child2?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| if (is_text) { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| child2 | |
| ); | |
| } | |
| set_hydrate_node(child2); | |
| return child2; | |
| } | |
| function first_child(node, is_text = false) { | |
| if (!hydrating) { | |
| var first = /* @__PURE__ */ get_first_child(node); | |
| if (first instanceof Comment && first.data === "") return /* @__PURE__ */ get_next_sibling(first); | |
| return first; | |
| } | |
| if (is_text) { | |
| if (hydrate_node?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| hydrate_node?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| hydrate_node | |
| ); | |
| } | |
| return hydrate_node; | |
| } | |
| function sibling(node, count = 1, is_text = false) { | |
| let next_sibling = hydrating ? hydrate_node : node; | |
| var last_sibling; | |
| while (count--) { | |
| last_sibling = next_sibling; | |
| next_sibling = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(next_sibling); | |
| } | |
| if (!hydrating) { | |
| return next_sibling; | |
| } | |
| if (is_text) { | |
| if (next_sibling?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| if (next_sibling === null) { | |
| last_sibling?.after(text2); | |
| } else { | |
| next_sibling.before(text2); | |
| } | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| next_sibling | |
| ); | |
| } | |
| set_hydrate_node(next_sibling); | |
| return next_sibling; | |
| } | |
| function clear_text_content(node) { | |
| node.textContent = ""; | |
| } | |
| function should_defer_append() { | |
| return false; | |
| } | |
| function create_element(tag, namespace, is2) { | |
| let options = void 0; | |
| return ( | |
| /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ | |
| document.createElementNS(namespace ?? NAMESPACE_HTML, tag, options) | |
| ); | |
| } | |
| function merge_text_nodes(text2) { | |
| if ( | |
| /** @type {string} */ | |
| text2.nodeValue.length < 65536 | |
| ) { | |
| return; | |
| } | |
| let next2 = text2.nextSibling; | |
| while (next2 !== null && next2.nodeType === TEXT_NODE) { | |
| next2.remove(); | |
| text2.nodeValue += /** @type {string} */ | |
| next2.nodeValue; | |
| next2 = text2.nextSibling; | |
| } | |
| } | |
| function handle_error(error) { | |
| var effect2 = active_effect; | |
| if (effect2 === null) { | |
| active_reaction.f |= ERROR_VALUE; | |
| return error; | |
| } | |
| if ((effect2.f & REACTION_RAN) === 0 && (effect2.f & EFFECT) === 0) { | |
| throw error; | |
| } | |
| invoke_error_boundary(error, effect2); | |
| } | |
| function invoke_error_boundary(error, effect2) { | |
| while (effect2 !== null) { | |
| if ((effect2.f & BOUNDARY_EFFECT) !== 0) { | |
| if ((effect2.f & REACTION_RAN) === 0) { | |
| throw error; | |
| } | |
| try { | |
| effect2.b.error(error); | |
| return; | |
| } catch (e) { | |
| error = e; | |
| } | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| throw error; | |
| } | |
| const STATUS_MASK = -7169; | |
| function set_signal_status(signal, status) { | |
| signal.f = signal.f & STATUS_MASK | status; | |
| } | |
| function update_derived_status(derived2) { | |
| if ((derived2.f & CONNECTED) !== 0 || derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| } else { | |
| set_signal_status(derived2, MAYBE_DIRTY); | |
| } | |
| } | |
| function clear_marked(deps) { | |
| if (deps === null) return; | |
| for (const dep of deps) { | |
| if ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) { | |
| continue; | |
| } | |
| dep.f ^= WAS_MARKED; | |
| clear_marked( | |
| /** @type {Derived} */ | |
| dep.deps | |
| ); | |
| } | |
| } | |
| function defer_effect(effect2, dirty_effects, maybe_dirty_effects) { | |
| if ((effect2.f & DIRTY) !== 0) { | |
| dirty_effects.add(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| maybe_dirty_effects.add(effect2); | |
| } | |
| clear_marked(effect2.deps); | |
| set_signal_status(effect2, CLEAN); | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set2(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set2(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set2, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set: set2, update, subscribe }; | |
| } | |
| function get$1(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let IS_UNMOUNTED = /* @__PURE__ */ Symbol("unmounted"); | |
| function store_get(store2, store_name, stores) { | |
| const entry = stores[store_name] ??= { | |
| store: null, | |
| source: /* @__PURE__ */ mutable_source(void 0), | |
| unsubscribe: noop | |
| }; | |
| if (entry.store !== store2 && !(IS_UNMOUNTED in stores)) { | |
| entry.unsubscribe(); | |
| entry.store = store2 ?? null; | |
| if (store2 == null) { | |
| entry.source.v = void 0; | |
| entry.unsubscribe = noop; | |
| } else { | |
| var is_synchronous_callback = true; | |
| entry.unsubscribe = subscribe_to_store(store2, (v) => { | |
| if (is_synchronous_callback) { | |
| entry.source.v = v; | |
| } else { | |
| set(entry.source, v); | |
| } | |
| }); | |
| is_synchronous_callback = false; | |
| } | |
| } | |
| if (store2 && IS_UNMOUNTED in stores) { | |
| return get$1(store2); | |
| } | |
| return get(entry.source); | |
| } | |
| function setup_stores() { | |
| const stores = {}; | |
| function cleanup() { | |
| teardown(() => { | |
| for (var store_name in stores) { | |
| const ref = stores[store_name]; | |
| ref.unsubscribe(); | |
| } | |
| define_property(stores, IS_UNMOUNTED, { | |
| enumerable: false, | |
| value: true | |
| }); | |
| }); | |
| } | |
| return [stores, cleanup]; | |
| } | |
| let first_batch = null; | |
| let last_batch = null; | |
| let current_batch = null; | |
| let previous_batch = null; | |
| let batch_values = null; | |
| let last_scheduled_effect = null; | |
| let is_flushing_sync = false; | |
| let is_processing = false; | |
| let collected_effects = null; | |
| let legacy_updates = null; | |
| var flush_count = 0; | |
| var source_stacks = /* @__PURE__ */ new Set(); | |
| let uid = 1; | |
| class Batch { | |
| id = uid++; | |
| /** True as soon as `#process` was called */ | |
| #started = false; | |
| linked = true; | |
| /** @type {Batch | null} */ | |
| #prev = null; | |
| /** @type {Batch | null} */ | |
| #next = null; | |
| /** @type {Map<Effect, ReturnType<typeof deferred<any>>>} */ | |
| async_deriveds = /* @__PURE__ */ new Map(); | |
| /** | |
| * The current values of any signals that are updated in this batch. | |
| * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment) | |
| * They keys of this map are identical to `this.#previous` | |
| * @type {Map<Value, [any, boolean]>} | |
| */ | |
| current = /* @__PURE__ */ new Map(); | |
| /** | |
| * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place. | |
| * They keys of this map are identical to `this.#current` | |
| * @type {Map<Value, any>} | |
| */ | |
| previous = /* @__PURE__ */ new Map(); | |
| /** | |
| * Async effects which this batch doesn't take into account anymore when calculating blockers, | |
| * as it has a value for it already. | |
| * @type {Set<Effect>} | |
| */ | |
| unblocked = /* @__PURE__ */ new Set(); | |
| /** | |
| * When the batch is committed (and the DOM is updated), we need to remove old branches | |
| * and append new ones by calling the functions added inside (if/each/key/etc) blocks | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * If a fork is discarded, we need to destroy any effects that are no longer needed | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #discard_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * Callbacks that should run only when a fork is committed. | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #fork_commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * The number of async effects that are currently in flight | |
| */ | |
| #pending = 0; | |
| /** | |
| * Async effects that are currently in flight, _not_ inside a pending boundary | |
| * @type {Map<Effect, number>} | |
| */ | |
| #blocking_pending = /* @__PURE__ */ new Map(); | |
| /** | |
| * A deferred that resolves when the batch is committed, used with `settled()` | |
| * TODO replace with Promise.withResolvers once supported widely enough | |
| * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null} | |
| */ | |
| #deferred = null; | |
| /** | |
| * The root effects that need to be flushed | |
| * @type {Effect[]} | |
| */ | |
| #roots = []; | |
| /** | |
| * Effects created while this batch was active. | |
| * @type {Effect[]} | |
| */ | |
| #new_effects = []; | |
| /** | |
| * Deferred effects (which run after async work has completed) that are DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * Deferred effects that are MAYBE_DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A map of branches that still exist, but will be destroyed when this batch | |
| * is committed — we skip over these during `process`. | |
| * The value contains child effects that were dirty/maybe_dirty before being reset, | |
| * so they can be rescheduled if the branch survives. | |
| * @type {Map<Effect, { d: Effect[], m: Effect[] }>} | |
| */ | |
| #skipped_branches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing | |
| * @type {Set<Effect>} | |
| */ | |
| #unskipped_branches = /* @__PURE__ */ new Set(); | |
| is_fork = false; | |
| #decrement_queued = false; | |
| #is_deferred() { | |
| if (this.is_fork) return true; | |
| for (const effect2 of this.#blocking_pending.keys()) { | |
| var e = effect2; | |
| var skipped = false; | |
| while (e.parent !== null) { | |
| if (this.#skipped_branches.has(e)) { | |
| skipped = true; | |
| break; | |
| } | |
| e = e.parent; | |
| } | |
| if (!skipped) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Add an effect to the #skipped_branches map and reset its children | |
| * @param {Effect} effect | |
| */ | |
| skip_effect(effect2) { | |
| if (!this.#skipped_branches.has(effect2)) { | |
| this.#skipped_branches.set(effect2, { d: [], m: [] }); | |
| } | |
| this.#unskipped_branches.delete(effect2); | |
| } | |
| /** | |
| * Remove an effect from the #skipped_branches map and reschedule | |
| * any tracked dirty/maybe_dirty child effects | |
| * @param {Effect} effect | |
| * @param {(e: Effect) => void} callback | |
| */ | |
| unskip_effect(effect2, callback = (e) => this.schedule(e)) { | |
| var tracked = this.#skipped_branches.get(effect2); | |
| if (tracked) { | |
| this.#skipped_branches.delete(effect2); | |
| for (var e of tracked.d) { | |
| set_signal_status(e, DIRTY); | |
| callback(e); | |
| } | |
| for (e of tracked.m) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| callback(e); | |
| } | |
| } | |
| this.#unskipped_branches.add(effect2); | |
| } | |
| #process() { | |
| this.#started = true; | |
| if (flush_count++ > 1e3) { | |
| this.#unlink(); | |
| infinite_loop_guard(); | |
| } | |
| if (!this.#is_deferred()) { | |
| for (const e of this.#dirty_effects) { | |
| this.#maybe_dirty_effects.delete(e); | |
| set_signal_status(e, DIRTY); | |
| this.schedule(e); | |
| } | |
| for (const e of this.#maybe_dirty_effects) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| this.schedule(e); | |
| } | |
| } | |
| const roots = this.#roots; | |
| this.#roots = []; | |
| this.apply(); | |
| var effects = collected_effects = []; | |
| var render_effects = []; | |
| var updates = legacy_updates = []; | |
| for (const root2 of roots) { | |
| try { | |
| this.#traverse(root2, effects, render_effects); | |
| } catch (e) { | |
| reset_all(root2); | |
| throw e; | |
| } | |
| } | |
| current_batch = null; | |
| if (updates.length > 0) { | |
| var batch = Batch.ensure(); | |
| for (const e of updates) { | |
| batch.schedule(e); | |
| } | |
| } | |
| collected_effects = null; | |
| legacy_updates = null; | |
| if (this.#is_deferred()) { | |
| this.#defer_effects(render_effects); | |
| this.#defer_effects(effects); | |
| for (const [e, t] of this.#skipped_branches) { | |
| reset_branch(e, t); | |
| } | |
| if (updates.length > 0) { | |
| /** @type {unknown} */ | |
| current_batch.#process(); | |
| } | |
| return; | |
| } | |
| const earlier_batch = this.#find_earlier_batch(); | |
| if (earlier_batch) { | |
| earlier_batch.#merge(this); | |
| return; | |
| } | |
| this.#dirty_effects.clear(); | |
| this.#maybe_dirty_effects.clear(); | |
| for (const fn of this.#commit_callbacks) fn(this); | |
| this.#commit_callbacks.clear(); | |
| previous_batch = this; | |
| flush_queued_effects(render_effects); | |
| flush_queued_effects(effects); | |
| previous_batch = null; | |
| this.#deferred?.resolve(); | |
| var next_batch = ( | |
| /** @type {Batch | null} */ | |
| /** @type {unknown} */ | |
| current_batch | |
| ); | |
| if (this.linked && this.#pending === 0) { | |
| this.#unlink(); | |
| } | |
| if (this.#roots.length > 0) { | |
| if (next_batch === null) { | |
| next_batch = this; | |
| this.#link(); | |
| } | |
| const batch2 = next_batch; | |
| batch2.#roots.push(...this.#roots.filter((r2) => !batch2.#roots.includes(r2))); | |
| } | |
| if (next_batch !== null) { | |
| next_batch.#process(); | |
| } | |
| } | |
| /** | |
| * Traverse the effect tree, executing effects or stashing | |
| * them for later execution as appropriate | |
| * @param {Effect} root | |
| * @param {Effect[]} effects | |
| * @param {Effect[]} render_effects | |
| */ | |
| #traverse(root2, effects, render_effects) { | |
| root2.f ^= CLEAN; | |
| var effect2 = root2.first; | |
| while (effect2 !== null) { | |
| var flags2 = effect2.f; | |
| var is_branch = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; | |
| var is_skippable_branch = is_branch && (flags2 & CLEAN) !== 0; | |
| var skip = is_skippable_branch || (flags2 & INERT) !== 0 || this.#skipped_branches.has(effect2); | |
| if (!skip && effect2.fn !== null) { | |
| if (is_branch) { | |
| effect2.f ^= CLEAN; | |
| } else if ((flags2 & EFFECT) !== 0) { | |
| effects.push(effect2); | |
| } else if (is_dirty(effect2)) { | |
| if ((flags2 & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect2); | |
| update_effect(effect2); | |
| } | |
| var child2 = effect2.first; | |
| if (child2 !== null) { | |
| effect2 = child2; | |
| continue; | |
| } | |
| } | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if (next2 !== null) { | |
| effect2 = next2; | |
| break; | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| } | |
| } | |
| #find_earlier_batch() { | |
| var batch = this.#prev; | |
| while (batch !== null) { | |
| if (!batch.is_fork) { | |
| for (const [value, [, is_derived]] of this.current) { | |
| if (batch.current.has(value) && !is_derived) { | |
| return batch; | |
| } | |
| } | |
| } | |
| batch = batch.#prev; | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #merge(batch) { | |
| for (const [source2, value] of batch.current) { | |
| if (!this.previous.has(source2) && batch.previous.has(source2)) { | |
| this.previous.set(source2, batch.previous.get(source2)); | |
| } | |
| this.current.set(source2, value); | |
| } | |
| for (const [effect2, deferred2] of batch.async_deriveds) { | |
| const d = this.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| const mark = (value) => { | |
| var reactions = value.reactions; | |
| if (reactions === null) return; | |
| for (const reaction of reactions) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| } else { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if (flags2 & (ASYNC | BLOCK_EFFECT) && !this.async_deriveds.has(effect2)) { | |
| this.#maybe_dirty_effects.delete(effect2); | |
| set_signal_status(effect2, DIRTY); | |
| this.schedule(effect2); | |
| } | |
| } | |
| } | |
| }; | |
| for (const source2 of this.current.keys()) { | |
| mark(source2); | |
| } | |
| this.oncommit(() => batch.discard()); | |
| batch.#unlink(); | |
| current_batch = this; | |
| this.#process(); | |
| } | |
| /** | |
| * @param {Effect[]} effects | |
| */ | |
| #defer_effects(effects) { | |
| for (var i = 0; i < effects.length; i += 1) { | |
| defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| } | |
| /** | |
| * Associate a change to a given source with the current | |
| * batch, noting its previous and current values | |
| * @param {Value} source | |
| * @param {any} value | |
| * @param {boolean} [is_derived] | |
| */ | |
| capture(source2, value, is_derived = false) { | |
| if (source2.v !== UNINITIALIZED && !this.previous.has(source2)) { | |
| this.previous.set(source2, source2.v); | |
| } | |
| if ((source2.f & ERROR_VALUE) === 0) { | |
| this.current.set(source2, [value, is_derived]); | |
| batch_values?.set(source2, value); | |
| } | |
| if (!this.is_fork) { | |
| source2.v = value; | |
| } | |
| } | |
| activate() { | |
| current_batch = this; | |
| } | |
| deactivate() { | |
| current_batch = null; | |
| batch_values = null; | |
| } | |
| flush() { | |
| try { | |
| if (DEV) ; | |
| is_processing = true; | |
| current_batch = this; | |
| this.#process(); | |
| } finally { | |
| flush_count = 0; | |
| last_scheduled_effect = null; | |
| collected_effects = null; | |
| legacy_updates = null; | |
| is_processing = false; | |
| current_batch = null; | |
| batch_values = null; | |
| old_values.clear(); | |
| } | |
| } | |
| discard() { | |
| for (const fn of this.#discard_callbacks) fn(this); | |
| this.#discard_callbacks.clear(); | |
| this.#fork_commit_callbacks.clear(); | |
| this.#unlink(); | |
| } | |
| /** | |
| * @param {Effect} effect | |
| */ | |
| register_created_effect(effect2) { | |
| this.#new_effects.push(effect2); | |
| } | |
| #commit() { | |
| this.#unlink(); | |
| for (let batch = first_batch; batch !== null; batch = batch.#next) { | |
| var is_earlier = batch.id < this.id; | |
| var sources = []; | |
| for (const [source3, [value, is_derived]] of this.current) { | |
| if (batch.current.has(source3)) { | |
| var batch_value = ( | |
| /** @type {[any, boolean]} */ | |
| batch.current.get(source3)[0] | |
| ); | |
| if (is_earlier && value !== batch_value) { | |
| batch.current.set(source3, [value, is_derived]); | |
| } else { | |
| continue; | |
| } | |
| } | |
| sources.push(source3); | |
| } | |
| if (is_earlier) { | |
| for (const [effect2, deferred2] of this.async_deriveds) { | |
| const d = batch.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| } | |
| if (!batch.#started) continue; | |
| var others = [...batch.current.keys()].filter((s) => !this.current.has(s)); | |
| if (others.length === 0) { | |
| if (is_earlier) { | |
| batch.discard(); | |
| } | |
| } else if (sources.length > 0) { | |
| if (is_earlier) { | |
| for (const unskipped of this.#unskipped_branches) { | |
| batch.unskip_effect(unskipped, (e) => { | |
| if ((e.f & (BLOCK_EFFECT | ASYNC)) !== 0) { | |
| batch.schedule(e); | |
| } else { | |
| batch.#defer_effects([e]); | |
| } | |
| }); | |
| } | |
| } | |
| batch.activate(); | |
| var marked = /* @__PURE__ */ new Set(); | |
| var checked = /* @__PURE__ */ new Map(); | |
| for (var source2 of sources) { | |
| mark_effects(source2, others, marked, checked); | |
| } | |
| checked = /* @__PURE__ */ new Map(); | |
| var current_unequal = [...batch.current.keys()].filter( | |
| (c) => this.current.has(c) ? ( | |
| /** @type {[any, boolean]} */ | |
| this.current.get(c)[0] !== c.v | |
| ) : true | |
| ); | |
| if (current_unequal.length > 0) { | |
| for (const effect2 of this.#new_effects) { | |
| if ((effect2.f & (DESTROYED | INERT | EAGER_EFFECT)) === 0 && depends_on(effect2, current_unequal, checked)) { | |
| if ((effect2.f & (ASYNC | BLOCK_EFFECT)) !== 0) { | |
| set_signal_status(effect2, DIRTY); | |
| batch.schedule(effect2); | |
| } else { | |
| batch.#dirty_effects.add(effect2); | |
| } | |
| } | |
| } | |
| } | |
| if (batch.#roots.length > 0) { | |
| batch.apply(); | |
| for (var root2 of batch.#roots) { | |
| batch.#traverse(root2, [], []); | |
| } | |
| batch.#roots = []; | |
| } | |
| batch.deactivate(); | |
| } | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| increment(blocking, effect2) { | |
| this.#pending += 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| this.#blocking_pending.set(effect2, blocking_pending_count + 1); | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| decrement(blocking, effect2) { | |
| this.#pending -= 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| if (blocking_pending_count === 1) { | |
| this.#blocking_pending.delete(effect2); | |
| } else { | |
| this.#blocking_pending.set(effect2, blocking_pending_count - 1); | |
| } | |
| } | |
| if (this.#decrement_queued) return; | |
| this.#decrement_queued = true; | |
| queue_micro_task(() => { | |
| this.#decrement_queued = false; | |
| if (this.linked) { | |
| this.flush(); | |
| } | |
| }); | |
| } | |
| /** | |
| * @param {Set<Effect>} dirty_effects | |
| * @param {Set<Effect>} maybe_dirty_effects | |
| */ | |
| transfer_effects(dirty_effects, maybe_dirty_effects) { | |
| for (const e of dirty_effects) { | |
| this.#dirty_effects.add(e); | |
| } | |
| for (const e of maybe_dirty_effects) { | |
| this.#maybe_dirty_effects.add(e); | |
| } | |
| dirty_effects.clear(); | |
| maybe_dirty_effects.clear(); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| oncommit(fn) { | |
| this.#commit_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| ondiscard(fn) { | |
| this.#discard_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| on_fork_commit(fn) { | |
| this.#fork_commit_callbacks.add(fn); | |
| } | |
| run_fork_commit_callbacks() { | |
| for (const fn of this.#fork_commit_callbacks) fn(this); | |
| this.#fork_commit_callbacks.clear(); | |
| } | |
| settled() { | |
| return (this.#deferred ??= deferred()).promise; | |
| } | |
| static ensure() { | |
| if (current_batch === null) { | |
| const batch = current_batch = new Batch(); | |
| batch.#link(); | |
| if (!is_processing && !is_flushing_sync) { | |
| queue_micro_task(() => { | |
| if (!batch.#started) { | |
| batch.flush(); | |
| } | |
| }); | |
| } | |
| } | |
| return current_batch; | |
| } | |
| apply() { | |
| { | |
| batch_values = null; | |
| return; | |
| } | |
| } | |
| /** | |
| * | |
| * @param {Effect} effect | |
| */ | |
| schedule(effect2) { | |
| last_scheduled_effect = effect2; | |
| if (effect2.b?.is_pending && (effect2.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 && (effect2.f & REACTION_RAN) === 0) { | |
| effect2.b.defer_effect(effect2); | |
| return; | |
| } | |
| var e = effect2; | |
| while (e.parent !== null) { | |
| e = e.parent; | |
| var flags2 = e.f; | |
| if (collected_effects !== null && e === active_effect) { | |
| if ((active_reaction === null || (active_reaction.f & DERIVED) === 0) && true) { | |
| return; | |
| } | |
| } | |
| if ((flags2 & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { | |
| if ((flags2 & CLEAN) === 0) { | |
| return; | |
| } | |
| e.f ^= CLEAN; | |
| } | |
| } | |
| this.#roots.push(e); | |
| } | |
| #link() { | |
| if (last_batch === null) { | |
| first_batch = last_batch = this; | |
| } else { | |
| last_batch.#next = this; | |
| this.#prev = last_batch; | |
| } | |
| last_batch = this; | |
| } | |
| #unlink() { | |
| var prev = this.#prev; | |
| var next2 = this.#next; | |
| if (prev === null) { | |
| first_batch = next2; | |
| } else { | |
| prev.#next = next2; | |
| } | |
| if (next2 === null) { | |
| last_batch = prev; | |
| } else { | |
| next2.#prev = prev; | |
| } | |
| this.linked = false; | |
| } | |
| } | |
| function flushSync(fn) { | |
| var was_flushing_sync = is_flushing_sync; | |
| is_flushing_sync = true; | |
| try { | |
| var result; | |
| if (fn) ; | |
| while (true) { | |
| flush_tasks(); | |
| if (current_batch === null) { | |
| return ( | |
| /** @type {T} */ | |
| result | |
| ); | |
| } | |
| current_batch.flush(); | |
| } | |
| } finally { | |
| is_flushing_sync = was_flushing_sync; | |
| } | |
| } | |
| function infinite_loop_guard() { | |
| try { | |
| effect_update_depth_exceeded(); | |
| } catch (error) { | |
| invoke_error_boundary(error, last_scheduled_effect); | |
| } | |
| } | |
| let eager_block_effects = null; | |
| function flush_queued_effects(effects) { | |
| var length = effects.length; | |
| if (length === 0) return; | |
| var i = 0; | |
| while (i < length) { | |
| var effect2 = effects[i++]; | |
| if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) { | |
| eager_block_effects = /* @__PURE__ */ new Set(); | |
| update_effect(effect2); | |
| if (effect2.deps === null && effect2.first === null && effect2.nodes === null && effect2.teardown === null && effect2.ac === null) { | |
| unlink_effect(effect2); | |
| } | |
| if (eager_block_effects?.size > 0) { | |
| old_values.clear(); | |
| for (const e of eager_block_effects) { | |
| if ((e.f & (DESTROYED | INERT)) !== 0) continue; | |
| const ordered_effects = [e]; | |
| let ancestor = e.parent; | |
| while (ancestor !== null) { | |
| if (eager_block_effects.has(ancestor)) { | |
| eager_block_effects.delete(ancestor); | |
| ordered_effects.push(ancestor); | |
| } | |
| ancestor = ancestor.parent; | |
| } | |
| for (let j = ordered_effects.length - 1; j >= 0; j--) { | |
| const e2 = ordered_effects[j]; | |
| if ((e2.f & (DESTROYED | INERT)) !== 0) continue; | |
| update_effect(e2); | |
| } | |
| } | |
| eager_block_effects.clear(); | |
| } | |
| } | |
| } | |
| eager_block_effects = null; | |
| } | |
| function mark_effects(value, sources, marked, checked) { | |
| if (marked.has(value)) return; | |
| marked.add(value); | |
| if (value.reactions !== null) { | |
| for (const reaction of value.reactions) { | |
| const flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark_effects( | |
| /** @type {Derived} */ | |
| reaction, | |
| sources, | |
| marked, | |
| checked | |
| ); | |
| } else if ((flags2 & (ASYNC | BLOCK_EFFECT)) !== 0 && (flags2 & DIRTY) === 0 && depends_on(reaction, sources, checked)) { | |
| set_signal_status(reaction, DIRTY); | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| function depends_on(reaction, sources, checked) { | |
| const depends = checked.get(reaction); | |
| if (depends !== void 0) return depends; | |
| if (reaction.deps !== null) { | |
| for (const dep of reaction.deps) { | |
| if (includes.call(sources, dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on( | |
| /** @type {Derived} */ | |
| dep, | |
| sources, | |
| checked | |
| )) { | |
| checked.set( | |
| /** @type {Derived} */ | |
| dep, | |
| true | |
| ); | |
| return true; | |
| } | |
| } | |
| } | |
| checked.set(reaction, false); | |
| return false; | |
| } | |
| function schedule_effect(effect2) { | |
| current_batch.schedule(effect2); | |
| } | |
| function reset_branch(effect2, tracked) { | |
| if ((effect2.f & BRANCH_EFFECT) !== 0 && (effect2.f & CLEAN) !== 0) { | |
| return; | |
| } | |
| if ((effect2.f & DIRTY) !== 0) { | |
| tracked.d.push(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| tracked.m.push(effect2); | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_branch(e, tracked); | |
| e = e.next; | |
| } | |
| } | |
| function reset_all(effect2) { | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_all(e); | |
| e = e.next; | |
| } | |
| } | |
| function createSubscriber(start) { | |
| let subscribers = 0; | |
| let version = source(0); | |
| let stop; | |
| return () => { | |
| if (effect_tracking()) { | |
| get(version); | |
| render_effect(() => { | |
| if (subscribers === 0) { | |
| stop = untrack(() => start(() => increment(version))); | |
| } | |
| subscribers += 1; | |
| return () => { | |
| queue_micro_task(() => { | |
| subscribers -= 1; | |
| if (subscribers === 0) { | |
| stop?.(); | |
| stop = void 0; | |
| increment(version); | |
| } | |
| }); | |
| }; | |
| }); | |
| } | |
| }; | |
| } | |
| var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED; | |
| function boundary(node, props, children, transform_error) { | |
| new Boundary(node, props, children, transform_error); | |
| } | |
| class Boundary { | |
| /** @type {Boundary | null} */ | |
| parent; | |
| is_pending = false; | |
| /** | |
| * API-level transformError transform function. Transforms errors before they reach the `failed` snippet. | |
| * Inherited from parent boundary, or defaults to identity. | |
| * @type {(error: unknown) => unknown} | |
| */ | |
| transform_error; | |
| /** @type {TemplateNode} */ | |
| #anchor; | |
| /** @type {TemplateNode | null} */ | |
| #hydrate_open = hydrating ? hydrate_node : null; | |
| /** @type {BoundaryProps} */ | |
| #props; | |
| /** @type {((anchor: Node) => void)} */ | |
| #children; | |
| /** @type {Effect} */ | |
| #effect; | |
| /** @type {Effect | null} */ | |
| #main_effect = null; | |
| /** @type {Effect | null} */ | |
| #pending_effect = null; | |
| /** @type {Effect | null} */ | |
| #failed_effect = null; | |
| /** @type {DocumentFragment | null} */ | |
| #offscreen_fragment = null; | |
| #local_pending_count = 0; | |
| #pending_count = 0; | |
| #pending_count_update_queued = false; | |
| /** @type {Set<Effect>} */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** @type {Set<Effect>} */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A source containing the number of pending async deriveds/expressions. | |
| * Only created if `$effect.pending()` is used inside the boundary, | |
| * otherwise updating the source results in needless `Batch.ensure()` | |
| * calls followed by no-op flushes | |
| * @type {Source<number> | null} | |
| */ | |
| #effect_pending = null; | |
| #effect_pending_subscriber = createSubscriber(() => { | |
| this.#effect_pending = source(this.#local_pending_count); | |
| return () => { | |
| this.#effect_pending = null; | |
| }; | |
| }); | |
| /** | |
| * @param {TemplateNode} node | |
| * @param {BoundaryProps} props | |
| * @param {((anchor: Node) => void)} children | |
| * @param {((error: unknown) => unknown) | undefined} [transform_error] | |
| */ | |
| constructor(node, props, children, transform_error) { | |
| this.#anchor = node; | |
| this.#props = props; | |
| this.#children = (anchor) => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| children(anchor); | |
| }; | |
| this.parent = /** @type {Effect} */ | |
| active_effect.b; | |
| this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e); | |
| this.#effect = block(() => { | |
| if (hydrating) { | |
| const comment2 = ( | |
| /** @type {Comment} */ | |
| this.#hydrate_open | |
| ); | |
| hydrate_next(); | |
| const server_rendered_pending = comment2.data === HYDRATION_START_ELSE; | |
| const server_rendered_failed = comment2.data.startsWith(HYDRATION_START_FAILED); | |
| if (server_rendered_failed) { | |
| const serialized_error = JSON.parse(comment2.data.slice(HYDRATION_START_FAILED.length)); | |
| this.#hydrate_failed_content(serialized_error); | |
| } else if (server_rendered_pending) { | |
| this.#hydrate_pending_content(); | |
| } else { | |
| this.#hydrate_resolved_content(); | |
| } | |
| } else { | |
| this.#render(); | |
| } | |
| }, flags); | |
| if (hydrating) { | |
| this.#anchor = hydrate_node; | |
| } | |
| } | |
| #hydrate_resolved_content() { | |
| try { | |
| this.#main_effect = branch(() => this.#children(this.#anchor)); | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error The deserialized error from the server's hydration comment | |
| */ | |
| #hydrate_failed_content(error) { | |
| const failed = this.#props.failed; | |
| if (!failed) return; | |
| this.#failed_effect = branch(() => { | |
| failed( | |
| this.#anchor, | |
| () => error, | |
| () => () => { | |
| } | |
| ); | |
| }); | |
| } | |
| #hydrate_pending_content() { | |
| const pending = this.#props.pending; | |
| if (!pending) return; | |
| this.is_pending = true; | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| queue_micro_task(() => { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| var anchor = create_text(); | |
| fragment.append(anchor); | |
| this.#main_effect = this.#run(() => { | |
| return branch(() => this.#children(anchor)); | |
| }); | |
| if (this.#pending_count === 0) { | |
| this.#anchor.before(fragment); | |
| this.#offscreen_fragment = null; | |
| pause_effect( | |
| /** @type {Effect} */ | |
| this.#pending_effect, | |
| () => { | |
| this.#pending_effect = null; | |
| } | |
| ); | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| }); | |
| } | |
| #render() { | |
| try { | |
| this.is_pending = this.has_pending_snippet(); | |
| this.#pending_count = 0; | |
| this.#local_pending_count = 0; | |
| this.#main_effect = branch(() => { | |
| this.#children(this.#anchor); | |
| }); | |
| if (this.#pending_count > 0) { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| move_effect(this.#main_effect, fragment); | |
| const pending = ( | |
| /** @type {(anchor: Node) => void} */ | |
| this.#props.pending | |
| ); | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| } else { | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #resolve(batch) { | |
| this.is_pending = false; | |
| batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Defer an effect inside a pending boundary until the boundary resolves | |
| * @param {Effect} effect | |
| */ | |
| defer_effect(effect2) { | |
| defer_effect(effect2, this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Returns `false` if the effect exists inside a boundary whose pending snippet is shown | |
| * @returns {boolean} | |
| */ | |
| is_rendered() { | |
| return !this.is_pending && (!this.parent || this.parent.is_rendered()); | |
| } | |
| has_pending_snippet() { | |
| return !!this.#props.pending; | |
| } | |
| /** | |
| * @template T | |
| * @param {() => T} fn | |
| */ | |
| #run(fn) { | |
| var previous_effect = active_effect; | |
| var previous_reaction = active_reaction; | |
| var previous_ctx = component_context; | |
| set_active_effect(this.#effect); | |
| set_active_reaction(this.#effect); | |
| set_component_context(this.#effect.ctx); | |
| try { | |
| Batch.ensure(); | |
| return fn(); | |
| } catch (e) { | |
| handle_error(e); | |
| return null; | |
| } finally { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_ctx); | |
| } | |
| } | |
| /** | |
| * Updates the pending count associated with the currently visible pending snippet, | |
| * if any, such that we can replace the snippet with content once work is done | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| #update_pending_count(d, batch) { | |
| if (!this.has_pending_snippet()) { | |
| if (this.parent) { | |
| this.parent.#update_pending_count(d, batch); | |
| } | |
| return; | |
| } | |
| this.#pending_count += d; | |
| if (this.#pending_count === 0) { | |
| this.#resolve(batch); | |
| if (this.#pending_effect) { | |
| pause_effect(this.#pending_effect, () => { | |
| this.#pending_effect = null; | |
| }); | |
| } | |
| if (this.#offscreen_fragment) { | |
| this.#anchor.before(this.#offscreen_fragment); | |
| this.#offscreen_fragment = null; | |
| } | |
| } | |
| } | |
| /** | |
| * Update the source that powers `$effect.pending()` inside this boundary, | |
| * and controls when the current `pending` snippet (if any) is removed. | |
| * Do not call from inside the class | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| update_pending_count(d, batch) { | |
| this.#update_pending_count(d, batch); | |
| this.#local_pending_count += d; | |
| if (!this.#effect_pending || this.#pending_count_update_queued) return; | |
| this.#pending_count_update_queued = true; | |
| queue_micro_task(() => { | |
| this.#pending_count_update_queued = false; | |
| if (this.#effect_pending) { | |
| internal_set(this.#effect_pending, this.#local_pending_count); | |
| } | |
| }); | |
| } | |
| get_effect_pending() { | |
| this.#effect_pending_subscriber(); | |
| return get( | |
| /** @type {Source<number>} */ | |
| this.#effect_pending | |
| ); | |
| } | |
| /** @param {unknown} error */ | |
| error(error) { | |
| if (!this.#props.onerror && !this.#props.failed) { | |
| throw error; | |
| } | |
| if (current_batch?.is_fork) { | |
| if (this.#main_effect) current_batch.skip_effect(this.#main_effect); | |
| if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect); | |
| if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect); | |
| current_batch.on_fork_commit(() => { | |
| this.#handle_error(error); | |
| }); | |
| } else { | |
| this.#handle_error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error | |
| */ | |
| #handle_error(error) { | |
| if (this.#main_effect) { | |
| destroy_effect(this.#main_effect); | |
| this.#main_effect = null; | |
| } | |
| if (this.#pending_effect) { | |
| destroy_effect(this.#pending_effect); | |
| this.#pending_effect = null; | |
| } | |
| if (this.#failed_effect) { | |
| destroy_effect(this.#failed_effect); | |
| this.#failed_effect = null; | |
| } | |
| if (hydrating) { | |
| set_hydrate_node( | |
| /** @type {TemplateNode} */ | |
| this.#hydrate_open | |
| ); | |
| next(); | |
| set_hydrate_node(skip_nodes()); | |
| } | |
| var onerror = this.#props.onerror; | |
| let failed = this.#props.failed; | |
| var did_reset = false; | |
| var calling_on_error = false; | |
| const reset2 = () => { | |
| if (did_reset) { | |
| svelte_boundary_reset_noop(); | |
| return; | |
| } | |
| did_reset = true; | |
| if (calling_on_error) { | |
| svelte_boundary_reset_onerror(); | |
| } | |
| if (this.#failed_effect !== null) { | |
| pause_effect(this.#failed_effect, () => { | |
| this.#failed_effect = null; | |
| }); | |
| } | |
| this.#run(() => { | |
| this.#render(); | |
| }); | |
| }; | |
| const handle_error_result = (transformed_error) => { | |
| try { | |
| calling_on_error = true; | |
| onerror?.(transformed_error, reset2); | |
| calling_on_error = false; | |
| } catch (error2) { | |
| invoke_error_boundary(error2, this.#effect && this.#effect.parent); | |
| } | |
| if (failed) { | |
| this.#failed_effect = this.#run(() => { | |
| try { | |
| return branch(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| failed( | |
| this.#anchor, | |
| () => transformed_error, | |
| () => reset2 | |
| ); | |
| }); | |
| } catch (error2) { | |
| invoke_error_boundary( | |
| error2, | |
| /** @type {Effect} */ | |
| this.#effect.parent | |
| ); | |
| return null; | |
| } | |
| }); | |
| } | |
| }; | |
| queue_micro_task(() => { | |
| var result; | |
| try { | |
| result = this.transform_error(error); | |
| } catch (e) { | |
| invoke_error_boundary(e, this.#effect && this.#effect.parent); | |
| return; | |
| } | |
| if (result !== null && typeof result === "object" && typeof /** @type {any} */ | |
| result.then === "function") { | |
| result.then( | |
| handle_error_result, | |
| /** @param {unknown} e */ | |
| (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent) | |
| ); | |
| } else { | |
| handle_error_result(result); | |
| } | |
| }); | |
| } | |
| } | |
| function flatten(blockers, sync, async, fn) { | |
| const d = derived; | |
| var pending = blockers.filter((b) => !b.settled); | |
| if (async.length === 0 && pending.length === 0) { | |
| fn(sync.map(d)); | |
| return; | |
| } | |
| var parent = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var restore = capture(); | |
| var blocker_promise = pending.length === 1 ? pending[0].promise : pending.length > 1 ? Promise.all(pending.map((b) => b.promise)) : null; | |
| function finish(values) { | |
| if ((parent.f & DESTROYED) !== 0) { | |
| return; | |
| } | |
| restore(); | |
| try { | |
| fn(values); | |
| } catch (error) { | |
| invoke_error_boundary(error, parent); | |
| } | |
| unset_context(); | |
| } | |
| var decrement_pending = increment_pending(); | |
| if (async.length === 0) { | |
| blocker_promise.then(() => finish(sync.map(d))).finally(decrement_pending); | |
| return; | |
| } | |
| function run() { | |
| Promise.all(async.map((expression) => /* @__PURE__ */ async_derived(expression))).then((result) => finish([...sync.map(d), ...result])).catch((error) => invoke_error_boundary(error, parent)).finally(decrement_pending); | |
| } | |
| if (blocker_promise) { | |
| blocker_promise.then(() => { | |
| restore(); | |
| run(); | |
| unset_context(); | |
| }); | |
| } else { | |
| run(); | |
| } | |
| } | |
| function capture() { | |
| var previous_effect = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var previous_reaction = active_reaction; | |
| var previous_component_context = component_context; | |
| var previous_batch2 = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| return function restore(activate_batch = true) { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_component_context); | |
| if (activate_batch && (previous_effect.f & DESTROYED) === 0) { | |
| previous_batch2?.activate(); | |
| previous_batch2?.apply(); | |
| } | |
| }; | |
| } | |
| function unset_context(deactivate_batch = true) { | |
| set_active_effect(null); | |
| set_active_reaction(null); | |
| set_component_context(null); | |
| if (deactivate_batch) current_batch?.deactivate(); | |
| } | |
| function increment_pending() { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var boundary2 = ( | |
| /** @type {Boundary} */ | |
| effect2.b | |
| ); | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| var blocking = boundary2.is_rendered(); | |
| boundary2.update_pending_count(1, batch); | |
| batch.increment(blocking, effect2); | |
| return () => { | |
| boundary2.update_pending_count(-1, batch); | |
| batch.decrement(blocking, effect2); | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function derived(fn) { | |
| var flags2 = DERIVED | DIRTY; | |
| if (active_effect !== null) { | |
| active_effect.f |= EFFECT_PRESERVED; | |
| } | |
| const signal = { | |
| ctx: component_context, | |
| deps: null, | |
| effects: null, | |
| equals, | |
| f: flags2, | |
| fn, | |
| reactions: null, | |
| rv: 0, | |
| v: ( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ), | |
| wv: 0, | |
| parent: active_effect, | |
| ac: null | |
| }; | |
| return signal; | |
| } | |
| const OBSOLETE = /* @__PURE__ */ Symbol("obsolete"); | |
| // @__NO_SIDE_EFFECTS__ | |
| function async_derived(fn, label, location2) { | |
| let parent = ( | |
| /** @type {Effect | null} */ | |
| active_effect | |
| ); | |
| if (parent === null) { | |
| async_derived_orphan(); | |
| } | |
| var promise = ( | |
| /** @type {Promise<V>} */ | |
| /** @type {unknown} */ | |
| void 0 | |
| ); | |
| var signal = source( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ); | |
| var should_suspend = !active_reaction; | |
| var deferreds = /* @__PURE__ */ new Set(); | |
| async_effect(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var d = deferred(); | |
| promise = d.promise; | |
| try { | |
| Promise.resolve(fn()).then(d.resolve, (e) => { | |
| if (e !== STALE_REACTION) d.reject(e); | |
| }).finally(unset_context); | |
| } catch (error) { | |
| d.reject(error); | |
| unset_context(); | |
| } | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| if (should_suspend) { | |
| if ((effect2.f & REACTION_RAN) !== 0) { | |
| var decrement_pending = increment_pending(); | |
| } | |
| if ( | |
| /** @type {Boundary} */ | |
| parent.b.is_rendered() | |
| ) { | |
| batch.async_deriveds.get(effect2)?.reject(OBSOLETE); | |
| } else { | |
| for (const d2 of deferreds.values()) { | |
| d2.reject(OBSOLETE); | |
| } | |
| } | |
| deferreds.add(d); | |
| batch.async_deriveds.set(effect2, d); | |
| } | |
| const handler = (value, error = void 0) => { | |
| decrement_pending?.(); | |
| deferreds.delete(d); | |
| if (error === OBSOLETE) return; | |
| batch.activate(); | |
| if (error) { | |
| signal.f |= ERROR_VALUE; | |
| internal_set(signal, error); | |
| } else { | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| signal.f ^= ERROR_VALUE; | |
| } | |
| internal_set(signal, value); | |
| } | |
| batch.deactivate(); | |
| }; | |
| d.promise.then(handler, (e) => handler(null, e || "unknown")); | |
| }); | |
| teardown(() => { | |
| for (const d of deferreds) { | |
| d.reject(OBSOLETE); | |
| } | |
| }); | |
| return new Promise((fulfil) => { | |
| function next2(p) { | |
| function go() { | |
| if (p === promise) { | |
| fulfil(signal); | |
| } else { | |
| next2(promise); | |
| } | |
| } | |
| p.then(go, go); | |
| } | |
| next2(promise); | |
| }); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function user_derived(fn) { | |
| const d = /* @__PURE__ */ derived(fn); | |
| push_reaction_value(d); | |
| return d; | |
| } | |
| function destroy_derived_effects(derived2) { | |
| var effects = derived2.effects; | |
| if (effects !== null) { | |
| derived2.effects = null; | |
| for (var i = 0; i < effects.length; i += 1) { | |
| destroy_effect( | |
| /** @type {Effect} */ | |
| effects[i] | |
| ); | |
| } | |
| } | |
| } | |
| function execute_derived(derived2) { | |
| var value; | |
| var prev_active_effect = active_effect; | |
| var parent = derived2.parent; | |
| if (!is_destroying_effect && parent !== null && derived2.v !== UNINITIALIZED && // if it was never evaluated before, it's guaranteed to fail downstream, so we try to execute instead | |
| (parent.f & (DESTROYED | INERT)) !== 0) { | |
| derived_inert(); | |
| return derived2.v; | |
| } | |
| set_active_effect(parent); | |
| { | |
| try { | |
| derived2.f &= ~WAS_MARKED; | |
| destroy_derived_effects(derived2); | |
| value = update_reaction(derived2); | |
| } finally { | |
| set_active_effect(prev_active_effect); | |
| } | |
| } | |
| return value; | |
| } | |
| function update_derived(derived2) { | |
| var value = execute_derived(derived2); | |
| if (!derived2.equals(value)) { | |
| derived2.wv = increment_write_version(); | |
| if (!current_batch?.is_fork || derived2.deps === null) { | |
| if (current_batch !== null) { | |
| current_batch.capture(derived2, value, true); | |
| previous_batch?.capture(derived2, value, true); | |
| } else { | |
| derived2.v = value; | |
| } | |
| if (derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| return; | |
| } | |
| } | |
| } | |
| if (is_destroying_effect) { | |
| return; | |
| } | |
| if (batch_values !== null) { | |
| if (effect_tracking() || current_batch?.is_fork) { | |
| batch_values.set(derived2, value); | |
| } | |
| } else { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| function freeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown || e.ac) { | |
| e.teardown?.(); | |
| e.ac?.abort(STALE_REACTION); | |
| if (e.fn !== null) e.teardown = noop; | |
| e.ac = null; | |
| remove_reactions(e, 0); | |
| destroy_effect_children(e); | |
| } | |
| } | |
| } | |
| function unfreeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown && e.fn !== null) { | |
| update_effect(e); | |
| } | |
| } | |
| } | |
| let eager_effects = /* @__PURE__ */ new Set(); | |
| const old_values = /* @__PURE__ */ new Map(); | |
| let eager_effects_deferred = false; | |
| function source(v, stack) { | |
| var signal = { | |
| f: 0, | |
| // TODO ideally we could skip this altogether, but it causes type errors | |
| v, | |
| reactions: null, | |
| equals, | |
| rv: 0, | |
| wv: 0 | |
| }; | |
| return signal; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function state(v, stack) { | |
| const s = source(v); | |
| push_reaction_value(s); | |
| return s; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function mutable_source(initial_value, immutable = false, trackable = true) { | |
| const s = source(initial_value); | |
| if (!immutable) { | |
| s.equals = safe_equals; | |
| } | |
| return s; | |
| } | |
| function set(source2, value, should_proxy = false) { | |
| if (active_reaction !== null && // since we are untracking the function inside `$inspect.with` we need to add this check | |
| // to ensure we error if state is set inside an inspect effect | |
| (!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 && (current_sources === null || !includes.call(current_sources, source2))) { | |
| state_unsafe_mutation(); | |
| } | |
| let new_value = should_proxy ? proxy(value) : value; | |
| return internal_set(source2, new_value, legacy_updates); | |
| } | |
| function internal_set(source2, value, updated_during_traversal = null) { | |
| if (!source2.equals(value)) { | |
| old_values.set(source2, is_destroying_effect ? value : source2.v); | |
| var batch = Batch.ensure(); | |
| batch.capture(source2, value); | |
| if ((source2.f & DERIVED) !== 0) { | |
| const derived2 = ( | |
| /** @type {Derived} */ | |
| source2 | |
| ); | |
| if ((source2.f & DIRTY) !== 0) { | |
| execute_derived(derived2); | |
| } | |
| if (batch_values === null) { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| source2.wv = increment_write_version(); | |
| mark_reactions(source2, DIRTY, updated_during_traversal); | |
| if (active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { | |
| if (untracked_writes === null) { | |
| set_untracked_writes([source2]); | |
| } else { | |
| untracked_writes.push(source2); | |
| } | |
| } | |
| if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) { | |
| flush_eager_effects(); | |
| } | |
| } | |
| return value; | |
| } | |
| function flush_eager_effects() { | |
| eager_effects_deferred = false; | |
| for (const effect2 of eager_effects) { | |
| if ((effect2.f & CLEAN) !== 0) { | |
| set_signal_status(effect2, MAYBE_DIRTY); | |
| } | |
| let dirty; | |
| try { | |
| dirty = is_dirty(effect2); | |
| } catch { | |
| dirty = true; | |
| } | |
| if (dirty) { | |
| update_effect(effect2); | |
| } | |
| } | |
| eager_effects.clear(); | |
| } | |
| function increment(source2) { | |
| set(source2, source2.v + 1); | |
| } | |
| function mark_reactions(signal, status, updated_during_traversal) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| var length = reactions.length; | |
| for (var i = 0; i < length; i++) { | |
| var reaction = reactions[i]; | |
| var flags2 = reaction.f; | |
| var not_dirty = (flags2 & DIRTY) === 0; | |
| if (not_dirty) { | |
| set_signal_status(reaction, status); | |
| } | |
| if ((flags2 & EAGER_EFFECT) !== 0) { | |
| eager_effects.add( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } else if ((flags2 & DERIVED) !== 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| batch_values?.delete(derived2); | |
| if ((flags2 & WAS_MARKED) === 0) { | |
| if (flags2 & CONNECTED && (active_effect === null || (active_effect.f & REACTION_IS_UPDATING) === 0)) { | |
| reaction.f |= WAS_MARKED; | |
| } | |
| mark_reactions(derived2, MAYBE_DIRTY, updated_during_traversal); | |
| } | |
| } else if (not_dirty) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if ((flags2 & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) { | |
| eager_block_effects.add(effect2); | |
| } | |
| if (updated_during_traversal !== null) { | |
| updated_during_traversal.push(effect2); | |
| } else { | |
| schedule_effect(effect2); | |
| } | |
| } | |
| } | |
| } | |
| function autofocus(dom, value) { | |
| if (value) { | |
| const body = document.body; | |
| dom.autofocus = true; | |
| queue_micro_task(() => { | |
| if (document.activeElement === body) { | |
| dom.focus(); | |
| } | |
| }); | |
| } | |
| } | |
| let listening_to_form_reset = false; | |
| function add_form_reset_listener() { | |
| if (!listening_to_form_reset) { | |
| listening_to_form_reset = true; | |
| document.addEventListener( | |
| "reset", | |
| (evt) => { | |
| Promise.resolve().then(() => { | |
| if (!evt.defaultPrevented) { | |
| for ( | |
| const e of | |
| /**@type {HTMLFormElement} */ | |
| evt.target.elements | |
| ) { | |
| e[FORM_RESET_HANDLER]?.(); | |
| } | |
| } | |
| }); | |
| }, | |
| // In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation) | |
| { capture: true } | |
| ); | |
| } | |
| } | |
| function without_reactive_context(fn) { | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| return fn(); | |
| } finally { | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| function listen_to_event_and_reset_event(element, event2, handler, on_reset = handler) { | |
| element.addEventListener(event2, () => without_reactive_context(handler)); | |
| const prev = ( | |
| /** @type {any} */ | |
| element[FORM_RESET_HANDLER] | |
| ); | |
| if (prev) { | |
| element[FORM_RESET_HANDLER] = () => { | |
| prev(); | |
| on_reset(true); | |
| }; | |
| } else { | |
| element[FORM_RESET_HANDLER] = () => on_reset(true); | |
| } | |
| add_form_reset_listener(); | |
| } | |
| let is_updating_effect = false; | |
| let is_destroying_effect = false; | |
| function set_is_destroying_effect(value) { | |
| is_destroying_effect = value; | |
| } | |
| let active_reaction = null; | |
| let untracking = false; | |
| function set_active_reaction(reaction) { | |
| active_reaction = reaction; | |
| } | |
| let active_effect = null; | |
| function set_active_effect(effect2) { | |
| active_effect = effect2; | |
| } | |
| let current_sources = null; | |
| function push_reaction_value(value) { | |
| if (active_reaction !== null && true) { | |
| if (current_sources === null) { | |
| current_sources = [value]; | |
| } else { | |
| current_sources.push(value); | |
| } | |
| } | |
| } | |
| let new_deps = null; | |
| let skipped_deps = 0; | |
| let untracked_writes = null; | |
| function set_untracked_writes(value) { | |
| untracked_writes = value; | |
| } | |
| let write_version = 1; | |
| let read_version = 0; | |
| let update_version = read_version; | |
| function set_update_version(value) { | |
| update_version = value; | |
| } | |
| function increment_write_version() { | |
| return ++write_version; | |
| } | |
| function is_dirty(reaction) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DIRTY) !== 0) { | |
| return true; | |
| } | |
| if (flags2 & DERIVED) { | |
| reaction.f &= ~WAS_MARKED; | |
| } | |
| if ((flags2 & MAYBE_DIRTY) !== 0) { | |
| var dependencies = ( | |
| /** @type {Value[]} */ | |
| reaction.deps | |
| ); | |
| var length = dependencies.length; | |
| for (var i = 0; i < length; i++) { | |
| var dependency = dependencies[i]; | |
| if (is_dirty( | |
| /** @type {Derived} */ | |
| dependency | |
| )) { | |
| update_derived( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| } | |
| if (dependency.wv > reaction.wv) { | |
| return true; | |
| } | |
| } | |
| if ((flags2 & CONNECTED) !== 0 && // During time traveling we don't want to reset the status so that | |
| // traversal of the graph in the other batches still happens | |
| batch_values === null) { | |
| set_signal_status(reaction, CLEAN); | |
| } | |
| } | |
| return false; | |
| } | |
| function schedule_possible_effect_self_invalidation(signal, effect2, root2 = true) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| if (current_sources !== null && includes.call(current_sources, signal)) { | |
| return; | |
| } | |
| for (var i = 0; i < reactions.length; i++) { | |
| var reaction = reactions[i]; | |
| if ((reaction.f & DERIVED) !== 0) { | |
| schedule_possible_effect_self_invalidation( | |
| /** @type {Derived} */ | |
| reaction, | |
| effect2, | |
| false | |
| ); | |
| } else if (effect2 === reaction) { | |
| if (root2) { | |
| set_signal_status(reaction, DIRTY); | |
| } else if ((reaction.f & CLEAN) !== 0) { | |
| set_signal_status(reaction, MAYBE_DIRTY); | |
| } | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| function update_reaction(reaction) { | |
| var previous_deps = new_deps; | |
| var previous_skipped_deps = skipped_deps; | |
| var previous_untracked_writes = untracked_writes; | |
| var previous_reaction = active_reaction; | |
| var previous_sources = current_sources; | |
| var previous_component_context = component_context; | |
| var previous_untracking = untracking; | |
| var previous_update_version = update_version; | |
| var flags2 = reaction.f; | |
| new_deps = /** @type {null | Value[]} */ | |
| null; | |
| skipped_deps = 0; | |
| untracked_writes = null; | |
| active_reaction = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; | |
| current_sources = null; | |
| set_component_context(reaction.ctx); | |
| untracking = false; | |
| update_version = ++read_version; | |
| if (reaction.ac !== null) { | |
| without_reactive_context(() => { | |
| reaction.ac.abort(STALE_REACTION); | |
| }); | |
| reaction.ac = null; | |
| } | |
| try { | |
| reaction.f |= REACTION_IS_UPDATING; | |
| var fn = ( | |
| /** @type {Function} */ | |
| reaction.fn | |
| ); | |
| var result = fn(); | |
| reaction.f |= REACTION_RAN; | |
| var deps = reaction.deps; | |
| var is_fork = current_batch?.is_fork; | |
| if (new_deps !== null) { | |
| var i; | |
| if (!is_fork) { | |
| remove_reactions(reaction, skipped_deps); | |
| } | |
| if (deps !== null && skipped_deps > 0) { | |
| deps.length = skipped_deps + new_deps.length; | |
| for (i = 0; i < new_deps.length; i++) { | |
| deps[skipped_deps + i] = new_deps[i]; | |
| } | |
| } else { | |
| reaction.deps = deps = new_deps; | |
| } | |
| if (effect_tracking() && (reaction.f & CONNECTED) !== 0) { | |
| for (i = skipped_deps; i < deps.length; i++) { | |
| (deps[i].reactions ??= []).push(reaction); | |
| } | |
| } | |
| } else if (!is_fork && deps !== null && skipped_deps < deps.length) { | |
| remove_reactions(reaction, skipped_deps); | |
| deps.length = skipped_deps; | |
| } | |
| if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0) { | |
| for (i = 0; i < /** @type {Source[]} */ | |
| untracked_writes.length; i++) { | |
| schedule_possible_effect_self_invalidation( | |
| untracked_writes[i], | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| if (previous_reaction !== null && previous_reaction !== reaction) { | |
| read_version++; | |
| if (previous_reaction.deps !== null) { | |
| for (let i2 = 0; i2 < previous_skipped_deps; i2 += 1) { | |
| previous_reaction.deps[i2].rv = read_version; | |
| } | |
| } | |
| if (previous_deps !== null) { | |
| for (const dep of previous_deps) { | |
| dep.rv = read_version; | |
| } | |
| } | |
| if (untracked_writes !== null) { | |
| if (previous_untracked_writes === null) { | |
| previous_untracked_writes = untracked_writes; | |
| } else { | |
| previous_untracked_writes.push(.../** @type {Source[]} */ | |
| untracked_writes); | |
| } | |
| } | |
| } | |
| if ((reaction.f & ERROR_VALUE) !== 0) { | |
| reaction.f ^= ERROR_VALUE; | |
| } | |
| return result; | |
| } catch (error) { | |
| return handle_error(error); | |
| } finally { | |
| reaction.f ^= REACTION_IS_UPDATING; | |
| new_deps = previous_deps; | |
| skipped_deps = previous_skipped_deps; | |
| untracked_writes = previous_untracked_writes; | |
| active_reaction = previous_reaction; | |
| current_sources = previous_sources; | |
| set_component_context(previous_component_context); | |
| untracking = previous_untracking; | |
| update_version = previous_update_version; | |
| } | |
| } | |
| function remove_reaction(signal, dependency) { | |
| let reactions = dependency.reactions; | |
| if (reactions !== null) { | |
| var index = index_of.call(reactions, signal); | |
| if (index !== -1) { | |
| var new_length = reactions.length - 1; | |
| if (new_length === 0) { | |
| reactions = dependency.reactions = null; | |
| } else { | |
| reactions[index] = reactions[new_length]; | |
| reactions.pop(); | |
| } | |
| } | |
| } | |
| if (reactions === null && (dependency.f & DERIVED) !== 0 && // Destroying a child effect while updating a parent effect can cause a dependency to appear | |
| // to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps` | |
| // allows us to skip the expensive work of disconnecting and immediately reconnecting it | |
| (new_deps === null || !includes.call(new_deps, dependency))) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| if ((derived2.f & CONNECTED) !== 0) { | |
| derived2.f ^= CONNECTED; | |
| derived2.f &= ~WAS_MARKED; | |
| } | |
| if (derived2.v !== UNINITIALIZED) { | |
| update_derived_status(derived2); | |
| } | |
| freeze_derived_effects(derived2); | |
| remove_reactions(derived2, 0); | |
| } | |
| } | |
| function remove_reactions(signal, start_index) { | |
| var dependencies = signal.deps; | |
| if (dependencies === null) return; | |
| for (var i = start_index; i < dependencies.length; i++) { | |
| remove_reaction(signal, dependencies[i]); | |
| } | |
| } | |
| function update_effect(effect2) { | |
| var flags2 = effect2.f; | |
| if ((flags2 & DESTROYED) !== 0) { | |
| return; | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var previous_effect = active_effect; | |
| var was_updating_effect = is_updating_effect; | |
| active_effect = effect2; | |
| is_updating_effect = true; | |
| try { | |
| if ((flags2 & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) { | |
| destroy_block_effect_children(effect2); | |
| } else { | |
| destroy_effect_children(effect2); | |
| } | |
| execute_effect_teardown(effect2); | |
| var teardown2 = update_reaction(effect2); | |
| effect2.teardown = typeof teardown2 === "function" ? teardown2 : null; | |
| effect2.wv = write_version; | |
| var dep; | |
| if (DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) ; | |
| } finally { | |
| is_updating_effect = was_updating_effect; | |
| active_effect = previous_effect; | |
| } | |
| } | |
| async function tick() { | |
| await Promise.resolve(); | |
| flushSync(); | |
| } | |
| function get(signal) { | |
| var flags2 = signal.f; | |
| var is_derived = (flags2 & DERIVED) !== 0; | |
| if (active_reaction !== null && !untracking) { | |
| var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0; | |
| if (!destroyed && (current_sources === null || !includes.call(current_sources, signal))) { | |
| var deps = active_reaction.deps; | |
| if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { | |
| if (signal.rv < read_version) { | |
| signal.rv = read_version; | |
| if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { | |
| skipped_deps++; | |
| } else if (new_deps === null) { | |
| new_deps = [signal]; | |
| } else { | |
| new_deps.push(signal); | |
| } | |
| } | |
| } else { | |
| (active_reaction.deps ??= []).push(signal); | |
| var reactions = signal.reactions; | |
| if (reactions === null) { | |
| signal.reactions = [active_reaction]; | |
| } else if (!includes.call(reactions, active_reaction)) { | |
| reactions.push(active_reaction); | |
| } | |
| } | |
| } | |
| } | |
| if (is_destroying_effect && old_values.has(signal)) { | |
| return old_values.get(signal); | |
| } | |
| if (is_derived) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| signal | |
| ); | |
| if (is_destroying_effect) { | |
| var value = derived2.v; | |
| if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) { | |
| value = execute_derived(derived2); | |
| } | |
| old_values.set(derived2, value); | |
| return value; | |
| } | |
| var should_connect = (derived2.f & CONNECTED) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & CONNECTED) !== 0); | |
| var is_new = (derived2.f & REACTION_RAN) === 0; | |
| if (is_dirty(derived2)) { | |
| if (should_connect) { | |
| derived2.f |= CONNECTED; | |
| } | |
| update_derived(derived2); | |
| } | |
| if (should_connect && !is_new) { | |
| unfreeze_derived_effects(derived2); | |
| reconnect(derived2); | |
| } | |
| } | |
| if (batch_values?.has(signal)) { | |
| return batch_values.get(signal); | |
| } | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| throw signal.v; | |
| } | |
| return signal.v; | |
| } | |
| function reconnect(derived2) { | |
| derived2.f |= CONNECTED; | |
| if (derived2.deps === null) return; | |
| for (const dep of derived2.deps) { | |
| (dep.reactions ??= []).push(derived2); | |
| if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) { | |
| unfreeze_derived_effects( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| reconnect( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| } | |
| } | |
| } | |
| function depends_on_old_values(derived2) { | |
| if (derived2.v === UNINITIALIZED) return true; | |
| if (derived2.deps === null) return false; | |
| for (const dep of derived2.deps) { | |
| if (old_values.has(dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on_old_values( | |
| /** @type {Derived} */ | |
| dep | |
| )) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function validate_effect(rune) { | |
| if (active_effect === null) { | |
| if (active_reaction === null) { | |
| effect_orphan(); | |
| } | |
| effect_in_unowned_derived(); | |
| } | |
| if (is_destroying_effect) { | |
| effect_in_teardown(); | |
| } | |
| } | |
| function push_effect(effect2, parent_effect) { | |
| var parent_last = parent_effect.last; | |
| if (parent_last === null) { | |
| parent_effect.last = parent_effect.first = effect2; | |
| } else { | |
| parent_last.next = effect2; | |
| effect2.prev = parent_last; | |
| parent_effect.last = effect2; | |
| } | |
| } | |
| function create_effect(type, fn) { | |
| var parent = active_effect; | |
| if (parent !== null && (parent.f & INERT) !== 0) { | |
| type |= INERT; | |
| } | |
| var effect2 = { | |
| ctx: component_context, | |
| deps: null, | |
| nodes: null, | |
| f: type | DIRTY | CONNECTED, | |
| first: null, | |
| fn, | |
| last: null, | |
| next: null, | |
| parent, | |
| b: parent && parent.b, | |
| prev: null, | |
| teardown: null, | |
| wv: 0, | |
| ac: null | |
| }; | |
| current_batch?.register_created_effect(effect2); | |
| var e = effect2; | |
| if ((type & EFFECT) !== 0) { | |
| if (collected_effects !== null) { | |
| collected_effects.push(effect2); | |
| } else { | |
| Batch.ensure().schedule(effect2); | |
| } | |
| } else if (fn !== null) { | |
| try { | |
| update_effect(effect2); | |
| } catch (e2) { | |
| destroy_effect(effect2); | |
| throw e2; | |
| } | |
| if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && // either `null`, or a singular child | |
| (e.f & EFFECT_PRESERVED) === 0) { | |
| e = e.first; | |
| if ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) { | |
| e.f |= EFFECT_TRANSPARENT; | |
| } | |
| } | |
| } | |
| if (e !== null) { | |
| e.parent = parent; | |
| if (parent !== null) { | |
| push_effect(e, parent); | |
| } | |
| if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| active_reaction | |
| ); | |
| (derived2.effects ??= []).push(e); | |
| } | |
| } | |
| return effect2; | |
| } | |
| function effect_tracking() { | |
| return active_reaction !== null && !untracking; | |
| } | |
| function teardown(fn) { | |
| const effect2 = create_effect(RENDER_EFFECT, null); | |
| set_signal_status(effect2, CLEAN); | |
| effect2.teardown = fn; | |
| return effect2; | |
| } | |
| function user_effect(fn) { | |
| validate_effect(); | |
| var flags2 = ( | |
| /** @type {Effect} */ | |
| active_effect.f | |
| ); | |
| var defer = !active_reaction && (flags2 & BRANCH_EFFECT) !== 0 && (flags2 & REACTION_RAN) === 0; | |
| if (defer) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| (context.e ??= []).push(fn); | |
| } else { | |
| return create_user_effect(fn); | |
| } | |
| } | |
| function create_user_effect(fn) { | |
| return create_effect(EFFECT | USER_EFFECT, fn); | |
| } | |
| function effect_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return () => { | |
| destroy_effect(effect2); | |
| }; | |
| } | |
| function component_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return (options = {}) => { | |
| return new Promise((fulfil) => { | |
| if (options.outro) { | |
| pause_effect(effect2, () => { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| }); | |
| } else { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| } | |
| }); | |
| }; | |
| } | |
| function effect(fn) { | |
| return create_effect(EFFECT, fn); | |
| } | |
| function async_effect(fn) { | |
| return create_effect(ASYNC | EFFECT_PRESERVED, fn); | |
| } | |
| function render_effect(fn, flags2 = 0) { | |
| return create_effect(RENDER_EFFECT | flags2, fn); | |
| } | |
| function template_effect(fn, sync = [], async = [], blockers = []) { | |
| flatten(blockers, sync, async, (values) => { | |
| create_effect(RENDER_EFFECT, () => fn(...values.map(get))); | |
| }); | |
| } | |
| function block(fn, flags2 = 0) { | |
| var effect2 = create_effect(BLOCK_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function managed(fn, flags2 = 0) { | |
| var effect2 = create_effect(MANAGED_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function branch(fn) { | |
| return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn); | |
| } | |
| function execute_effect_teardown(effect2) { | |
| var teardown2 = effect2.teardown; | |
| if (teardown2 !== null) { | |
| const previously_destroying_effect = is_destroying_effect; | |
| const previous_reaction = active_reaction; | |
| set_is_destroying_effect(true); | |
| set_active_reaction(null); | |
| try { | |
| teardown2.call(null); | |
| } finally { | |
| set_is_destroying_effect(previously_destroying_effect); | |
| set_active_reaction(previous_reaction); | |
| } | |
| } | |
| } | |
| function destroy_effect_children(signal, remove_dom = false) { | |
| var effect2 = signal.first; | |
| signal.first = signal.last = null; | |
| while (effect2 !== null) { | |
| const controller = effect2.ac; | |
| if (controller !== null) { | |
| without_reactive_context(() => { | |
| controller.abort(STALE_REACTION); | |
| }); | |
| } | |
| var next2 = effect2.next; | |
| if ((effect2.f & ROOT_EFFECT) !== 0) { | |
| effect2.parent = null; | |
| } else { | |
| destroy_effect(effect2, remove_dom); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_block_effect_children(signal) { | |
| var effect2 = signal.first; | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if ((effect2.f & BRANCH_EFFECT) === 0) { | |
| destroy_effect(effect2); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_effect(effect2, remove_dom = true) { | |
| var removed = false; | |
| if ((remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes !== null && effect2.nodes.end !== null) { | |
| remove_effect_dom( | |
| effect2.nodes.start, | |
| /** @type {TemplateNode} */ | |
| effect2.nodes.end | |
| ); | |
| removed = true; | |
| } | |
| set_signal_status(effect2, DESTROYING); | |
| destroy_effect_children(effect2, remove_dom && !removed); | |
| remove_reactions(effect2, 0); | |
| var transitions = effect2.nodes && effect2.nodes.t; | |
| if (transitions !== null) { | |
| for (const transition of transitions) { | |
| transition.stop(); | |
| } | |
| } | |
| execute_effect_teardown(effect2); | |
| effect2.f ^= DESTROYING; | |
| effect2.f |= DESTROYED; | |
| var parent = effect2.parent; | |
| if (parent !== null && parent.first !== null) { | |
| unlink_effect(effect2); | |
| } | |
| effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes = effect2.ac = effect2.b = null; | |
| } | |
| function remove_effect_dom(node, end) { | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function unlink_effect(effect2) { | |
| var parent = effect2.parent; | |
| var prev = effect2.prev; | |
| var next2 = effect2.next; | |
| if (prev !== null) prev.next = next2; | |
| if (next2 !== null) next2.prev = prev; | |
| if (parent !== null) { | |
| if (parent.first === effect2) parent.first = next2; | |
| if (parent.last === effect2) parent.last = prev; | |
| } | |
| } | |
| function pause_effect(effect2, callback, destroy = true) { | |
| var transitions = []; | |
| pause_children(effect2, transitions, true); | |
| var fn = () => { | |
| if (destroy) destroy_effect(effect2); | |
| if (callback) callback(); | |
| }; | |
| var remaining = transitions.length; | |
| if (remaining > 0) { | |
| var check = () => --remaining || fn(); | |
| for (var transition of transitions) { | |
| transition.out(check); | |
| } | |
| } else { | |
| fn(); | |
| } | |
| } | |
| function pause_children(effect2, transitions, local) { | |
| if ((effect2.f & INERT) !== 0) return; | |
| effect2.f ^= INERT; | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transitions.push(transition); | |
| } | |
| } | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| if ((child2.f & ROOT_EFFECT) === 0) { | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || // If this is a branch effect without a block effect parent, | |
| // it means the parent block effect was pruned. In that case, | |
| // transparency information was transferred to the branch effect. | |
| (child2.f & BRANCH_EFFECT) !== 0 && (effect2.f & BLOCK_EFFECT) !== 0; | |
| pause_children(child2, transitions, transparent ? local : false); | |
| } | |
| child2 = sibling2; | |
| } | |
| } | |
| function resume_effect(effect2) { | |
| resume_children(effect2, true); | |
| } | |
| function resume_children(effect2, local) { | |
| if ((effect2.f & INERT) === 0) return; | |
| effect2.f ^= INERT; | |
| if ((effect2.f & CLEAN) === 0) { | |
| set_signal_status(effect2, DIRTY); | |
| Batch.ensure().schedule(effect2); | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; | |
| resume_children(child2, transparent ? local : false); | |
| child2 = sibling2; | |
| } | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transition.in(); | |
| } | |
| } | |
| } | |
| } | |
| function move_effect(effect2, fragment) { | |
| if (!effect2.nodes) return; | |
| var node = effect2.nodes.start; | |
| var end = effect2.nodes.end; | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| fragment.append(node); | |
| node = next2; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get$1(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get$1(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get$1(scope.store), name); | |
| } | |
| scope.store.set(get$1(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (official website)", | |
| cancel: "Cancel", | |
| enterCode: "Enter code", | |
| enterCodeAria: "Enter code you hear. Press Space to play audio.", | |
| enterCodeFromImage: "To proceed, please enter the code from the image below.", | |
| error: "Verification failed. Try again later.", | |
| expired: "Verification expired. Try again.", | |
| footer: 'Protected by <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (official website)">ALTCHA</a>', | |
| getAudioChallenge: "Get an audio challenge", | |
| label: "I'm not a robot", | |
| loading: "Loading...", | |
| reload: "Reload", | |
| verify: "Verify", | |
| verificationRequired: "Verification required!", | |
| verified: "Verified", | |
| verifying: "Verifying...", | |
| waitAlert: "Verifying... please wait." | |
| }; | |
| globalThis.$altcha.i18n.set("en", i18n); | |
| const PUBLIC_VERSION = "5"; | |
| if (typeof window !== "undefined") { | |
| ((window.__svelte ??= {}).v ??= /* @__PURE__ */ new Set()).add(PUBLIC_VERSION); | |
| } | |
| const event_symbol = /* @__PURE__ */ Symbol("events"); | |
| const all_registered_events = /* @__PURE__ */ new Set(); | |
| const root_event_handles = /* @__PURE__ */ new Set(); | |
| function create_event(event_name, dom, handler, options = {}) { | |
| function target_handler(event2) { | |
| if (!options.capture) { | |
| handle_event_propagation.call(dom, event2); | |
| } | |
| if (!event2.cancelBubble) { | |
| return without_reactive_context(() => { | |
| return handler?.call(this, event2); | |
| }); | |
| } | |
| } | |
| if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") { | |
| queue_micro_task(() => { | |
| dom.addEventListener(event_name, target_handler, options); | |
| }); | |
| } else { | |
| dom.addEventListener(event_name, target_handler, options); | |
| } | |
| return target_handler; | |
| } | |
| function event(event_name, dom, handler, capture2, passive) { | |
| var options = { capture: capture2, passive }; | |
| var target_handler = create_event(event_name, dom, handler, options); | |
| if (dom === document.body || // @ts-ignore | |
| dom === window || // @ts-ignore | |
| dom === document || // Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed | |
| dom instanceof HTMLMediaElement) { | |
| teardown(() => { | |
| dom.removeEventListener(event_name, target_handler, options); | |
| }); | |
| } | |
| } | |
| function delegated(event_name, element, handler) { | |
| (element[event_symbol] ??= {})[event_name] = handler; | |
| } | |
| function delegate(events) { | |
| for (var i = 0; i < events.length; i++) { | |
| all_registered_events.add(events[i]); | |
| } | |
| for (var fn of root_event_handles) { | |
| fn(events); | |
| } | |
| } | |
| let last_propagated_event = null; | |
| function handle_event_propagation(event2) { | |
| var handler_element = this; | |
| var owner_document = ( | |
| /** @type {Node} */ | |
| handler_element.ownerDocument | |
| ); | |
| var event_name = event2.type; | |
| var path = event2.composedPath?.() || []; | |
| var current_target = ( | |
| /** @type {null | Element} */ | |
| path[0] || event2.target | |
| ); | |
| last_propagated_event = event2; | |
| var path_idx = 0; | |
| var handled_at = last_propagated_event === event2 && event2[event_symbol]; | |
| if (handled_at) { | |
| var at_idx = path.indexOf(handled_at); | |
| if (at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ | |
| window)) { | |
| event2[event_symbol] = handler_element; | |
| return; | |
| } | |
| var handler_idx = path.indexOf(handler_element); | |
| if (handler_idx === -1) { | |
| return; | |
| } | |
| if (at_idx <= handler_idx) { | |
| path_idx = at_idx; | |
| } | |
| } | |
| current_target = /** @type {Element} */ | |
| path[path_idx] || event2.target; | |
| if (current_target === handler_element) return; | |
| define_property(event2, "currentTarget", { | |
| configurable: true, | |
| get() { | |
| return current_target || owner_document; | |
| } | |
| }); | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| var throw_error; | |
| var other_errors = []; | |
| while (current_target !== null) { | |
| var parent_element = current_target.assignedSlot || current_target.parentNode || /** @type {any} */ | |
| current_target.host || null; | |
| try { | |
| var delegated2 = current_target[event_symbol]?.[event_name]; | |
| if (delegated2 != null && (!/** @type {any} */ | |
| current_target.disabled || // DOM could've been updated already by the time this is reached, so we check this as well | |
| // -> the target could not have been disabled because it emits the event in the first place | |
| event2.target === current_target)) { | |
| delegated2.call(current_target, event2); | |
| } | |
| } catch (error) { | |
| if (throw_error) { | |
| other_errors.push(error); | |
| } else { | |
| throw_error = error; | |
| } | |
| } | |
| if (event2.cancelBubble || parent_element === handler_element || parent_element === null) { | |
| break; | |
| } | |
| current_target = parent_element; | |
| } | |
| if (throw_error) { | |
| for (let error of other_errors) { | |
| queueMicrotask(() => { | |
| throw error; | |
| }); | |
| } | |
| throw throw_error; | |
| } | |
| } finally { | |
| event2[event_symbol] = handler_element; | |
| delete event2.currentTarget; | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| const policy = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| globalThis?.window?.trustedTypes && /* @__PURE__ */ globalThis.window.trustedTypes.createPolicy("svelte-trusted-html", { | |
| /** @param {string} html */ | |
| createHTML: (html2) => { | |
| return html2; | |
| } | |
| }) | |
| ); | |
| function create_trusted_html(html2) { | |
| return ( | |
| /** @type {string} */ | |
| policy?.createHTML(html2) ?? html2 | |
| ); | |
| } | |
| function create_fragment_from_html(html2) { | |
| var elem = create_element("template"); | |
| elem.innerHTML = create_trusted_html(html2.replaceAll("<!>", "<!---->")); | |
| return elem.content; | |
| } | |
| function assign_nodes(start, end) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| if (effect2.nodes === null) { | |
| effect2.nodes = { start, end, a: null, t: null }; | |
| } | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_html(content, flags2) { | |
| var is_fragment = (flags2 & TEMPLATE_FRAGMENT) !== 0; | |
| var use_import_node = (flags2 & TEMPLATE_USE_IMPORT_NODE) !== 0; | |
| var node; | |
| var has_start = !content.startsWith("<!>"); | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (node === void 0) { | |
| node = create_fragment_from_html(has_start ? content : "<!>" + content); | |
| if (!is_fragment) node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(node); | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true) | |
| ); | |
| if (is_fragment) { | |
| var start = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(clone) | |
| ); | |
| var end = ( | |
| /** @type {TemplateNode} */ | |
| clone.lastChild | |
| ); | |
| assign_nodes(start, end); | |
| } else { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_namespace(content, flags2, ns = "svg") { | |
| var has_start = !content.startsWith("<!>"); | |
| var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`; | |
| var node; | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (!node) { | |
| var fragment = ( | |
| /** @type {DocumentFragment} */ | |
| create_fragment_from_html(wrapped) | |
| ); | |
| var root2 = ( | |
| /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(fragment) | |
| ); | |
| { | |
| node = /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(root2); | |
| } | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| node.cloneNode(true) | |
| ); | |
| { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_svg(content, flags2) { | |
| return /* @__PURE__ */ from_namespace(content, flags2, "svg"); | |
| } | |
| function text(value = "") { | |
| if (!hydrating) { | |
| var t = create_text(value + ""); | |
| assign_nodes(t, t); | |
| return t; | |
| } | |
| var node = hydrate_node; | |
| if (node.nodeType !== TEXT_NODE) { | |
| node.before(node = create_text()); | |
| set_hydrate_node(node); | |
| } else { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| node | |
| ); | |
| } | |
| assign_nodes(node, node); | |
| return node; | |
| } | |
| function comment() { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| var frag = document.createDocumentFragment(); | |
| var start = document.createComment(""); | |
| var anchor = create_text(); | |
| frag.append(start, anchor); | |
| assign_nodes(start, anchor); | |
| return frag; | |
| } | |
| function append(anchor, dom) { | |
| if (hydrating) { | |
| var effect2 = ( | |
| /** @type {Effect & { nodes: EffectNodes }} */ | |
| active_effect | |
| ); | |
| if ((effect2.f & REACTION_RAN) === 0 || effect2.nodes.end === null) { | |
| effect2.nodes.end = hydrate_node; | |
| } | |
| hydrate_next(); | |
| return; | |
| } | |
| if (anchor === null) { | |
| return; | |
| } | |
| anchor.before( | |
| /** @type {Node} */ | |
| dom | |
| ); | |
| } | |
| function is_capture_event(name) { | |
| return name.endsWith("capture") && name !== "gotpointercapture" && name !== "lostpointercapture"; | |
| } | |
| const DELEGATED_EVENTS = [ | |
| "beforeinput", | |
| "click", | |
| "change", | |
| "dblclick", | |
| "contextmenu", | |
| "focusin", | |
| "focusout", | |
| "input", | |
| "keydown", | |
| "keyup", | |
| "mousedown", | |
| "mousemove", | |
| "mouseout", | |
| "mouseover", | |
| "mouseup", | |
| "pointerdown", | |
| "pointermove", | |
| "pointerout", | |
| "pointerover", | |
| "pointerup", | |
| "touchend", | |
| "touchmove", | |
| "touchstart" | |
| ]; | |
| function can_delegate_event(event_name) { | |
| return DELEGATED_EVENTS.includes(event_name); | |
| } | |
| const ATTRIBUTE_ALIASES = { | |
| // no `class: 'className'` because we handle that separately | |
| formnovalidate: "formNoValidate", | |
| ismap: "isMap", | |
| nomodule: "noModule", | |
| playsinline: "playsInline", | |
| readonly: "readOnly", | |
| defaultvalue: "defaultValue", | |
| defaultchecked: "defaultChecked", | |
| srcobject: "srcObject", | |
| novalidate: "noValidate", | |
| allowfullscreen: "allowFullscreen", | |
| disablepictureinpicture: "disablePictureInPicture", | |
| disableremoteplayback: "disableRemotePlayback" | |
| }; | |
| function normalize_attribute(name) { | |
| name = name.toLowerCase(); | |
| return ATTRIBUTE_ALIASES[name] ?? name; | |
| } | |
| const PASSIVE_EVENTS = ["touchstart", "touchmove"]; | |
| function is_passive_event(name) { | |
| return PASSIVE_EVENTS.includes(name); | |
| } | |
| function set_text(text2, value) { | |
| var str = value == null ? "" : typeof value === "object" ? `${value}` : value; | |
| if (str !== /** @type {any} */ | |
| (text2[TEXT_CACHE] ??= text2.nodeValue)) { | |
| text2[TEXT_CACHE] = str; | |
| text2.nodeValue = `${str}`; | |
| } | |
| } | |
| function mount(component2, options) { | |
| return _mount(component2, options); | |
| } | |
| function hydrate(component2, options) { | |
| init_operations(); | |
| options.intro = options.intro ?? false; | |
| const target = options.target; | |
| const was_hydrating = hydrating; | |
| const previous_hydrate_node = hydrate_node; | |
| try { | |
| var anchor = /* @__PURE__ */ get_first_child(target); | |
| while (anchor && (anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| anchor.data !== HYDRATION_START)) { | |
| anchor = /* @__PURE__ */ get_next_sibling(anchor); | |
| } | |
| if (!anchor) { | |
| throw HYDRATION_ERROR; | |
| } | |
| set_hydrating(true); | |
| set_hydrate_node( | |
| /** @type {Comment} */ | |
| anchor | |
| ); | |
| const instance = _mount(component2, { ...options, anchor }); | |
| set_hydrating(false); | |
| return ( | |
| /** @type {Exports} */ | |
| instance | |
| ); | |
| } catch (error) { | |
| if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) { | |
| throw error; | |
| } | |
| if (error !== HYDRATION_ERROR) { | |
| console.warn("Failed to hydrate: ", error); | |
| } | |
| if (options.recover === false) { | |
| hydration_failed(); | |
| } | |
| init_operations(); | |
| clear_text_content(target); | |
| set_hydrating(false); | |
| return mount(component2, options); | |
| } finally { | |
| set_hydrating(was_hydrating); | |
| set_hydrate_node(previous_hydrate_node); | |
| } | |
| } | |
| const listeners = /* @__PURE__ */ new Map(); | |
| function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) { | |
| init_operations(); | |
| var component2 = void 0; | |
| var unmount2 = component_root(() => { | |
| var anchor_node = anchor ?? target.appendChild(create_text()); | |
| boundary( | |
| /** @type {TemplateNode} */ | |
| anchor_node, | |
| { | |
| pending: () => { | |
| } | |
| }, | |
| (anchor_node2) => { | |
| push({}); | |
| var ctx = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| if (context) ctx.c = context; | |
| if (events) { | |
| props.$$events = events; | |
| } | |
| if (hydrating) { | |
| assign_nodes( | |
| /** @type {TemplateNode} */ | |
| anchor_node2, | |
| null | |
| ); | |
| } | |
| component2 = Component(anchor_node2, props) || {}; | |
| if (hydrating) { | |
| active_effect.nodes.end = hydrate_node; | |
| if (hydrate_node === null || hydrate_node.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| hydrate_node.data !== HYDRATION_END) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| } | |
| pop(); | |
| }, | |
| transformError | |
| ); | |
| var registered_events = /* @__PURE__ */ new Set(); | |
| var event_handle = (events2) => { | |
| for (var i = 0; i < events2.length; i++) { | |
| var event_name = events2[i]; | |
| if (registered_events.has(event_name)) continue; | |
| registered_events.add(event_name); | |
| var passive = is_passive_event(event_name); | |
| for (const node of [target, document]) { | |
| var counts = listeners.get(node); | |
| if (counts === void 0) { | |
| counts = /* @__PURE__ */ new Map(); | |
| listeners.set(node, counts); | |
| } | |
| var count = counts.get(event_name); | |
| if (count === void 0) { | |
| node.addEventListener(event_name, handle_event_propagation, { passive }); | |
| counts.set(event_name, 1); | |
| } else { | |
| counts.set(event_name, count + 1); | |
| } | |
| } | |
| } | |
| }; | |
| event_handle(array_from(all_registered_events)); | |
| root_event_handles.add(event_handle); | |
| return () => { | |
| for (var event_name of registered_events) { | |
| for (const node of [target, document]) { | |
| var counts = ( | |
| /** @type {Map<string, number>} */ | |
| listeners.get(node) | |
| ); | |
| var count = ( | |
| /** @type {number} */ | |
| counts.get(event_name) | |
| ); | |
| if (--count == 0) { | |
| node.removeEventListener(event_name, handle_event_propagation); | |
| counts.delete(event_name); | |
| if (counts.size === 0) { | |
| listeners.delete(node); | |
| } | |
| } else { | |
| counts.set(event_name, count); | |
| } | |
| } | |
| } | |
| root_event_handles.delete(event_handle); | |
| if (anchor_node !== anchor) { | |
| anchor_node.parentNode?.removeChild(anchor_node); | |
| } | |
| }; | |
| }); | |
| mounted_components.set(component2, unmount2); | |
| return component2; | |
| } | |
| let mounted_components = /* @__PURE__ */ new WeakMap(); | |
| function unmount(component2, options) { | |
| const fn = mounted_components.get(component2); | |
| if (fn) { | |
| mounted_components.delete(component2); | |
| return fn(options); | |
| } | |
| return Promise.resolve(); | |
| } | |
| class BranchManager { | |
| /** @type {TemplateNode} */ | |
| anchor; | |
| /** @type {Map<Batch, Key>} */ | |
| #batches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Map of keys to effects that are currently rendered in the DOM. | |
| * These effects are visible and actively part of the document tree. | |
| * Example: | |
| * |
변경 전i18n.js
변경 후i18n.js
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
변경 전gd_board_goods.js
| $(document).ready(function () { | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| } | |
| function openWriteLayer(bdId, goodsNo,sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| centerLayer(); | |
| }).error(function (e) { | |
| if(e.responseText) | |
| alert(e.responseText); | |
| $(document).ready(function () { | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| } | |
| function openWriteLayer(bdId, goodsNo,sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| centerLayer(); | |
| }).error(function (e) { | |
| if(e.responseText) | |
| alert(e.responseText); | |
변경 후gd_board_goods.js
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| } | |
| function loadAltchaModule() { | |
| if (window.gdAltchaModuleLoaded) { | |
| return; | |
| } | |
| const wrap = document.querySelector('.capcha_altcha[data-altcha-src]'); | |
| if (!wrap) { | |
| return; | |
| } | |
| window.gdAltchaModuleLoaded = true; | |
| const src = wrap.getAttribute('data-altcha-src'); | |
| [src, src.replace('altcha.js', 'i18n.js')].forEach(function (url) { | |
| const script = document.createElement('script'); | |
| script.type = 'module'; | |
| script.src = url; | |
| document.head.appendChild(script); | |
| }); | |
| } | |
| function openWriteLayer(bdId, goodsNo,sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| centerLayer(); | |
| loadAltchaModule(); | |
| }).error(function (e) { | |
| if(e.responseText) | |
| alert(e.responseText); | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var getData = function (id, target) { | |
| id = id.toLowerCase(); | |
| switch (id) { | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return true; | |
| } | |
| function loadAltchaModule() { | |
| if (window.gdAltchaModuleLoaded) { | |
| return; | |
| } | |
| const wrap = document.querySelector('.capcha_altcha[data-altcha-src]'); | |
| if (!wrap) { | |
| return; | |
| } | |
| window.gdAltchaModuleLoaded = true; | |
| const src = wrap.getAttribute('data-altcha-src'); | |
| [src, src.replace('altcha.js', 'i18n.js')].forEach(function (url) { | |
| const script = document.createElement('script'); | |
| script.type = 'module'; | |
| script.src = url; | |
| document.head.appendChild(script); | |
| }); | |
| } | |
| function openWriteLayer(bdId, goodsNo,sno) { | |
| $.ajax({ | |
| method: "GET", | |
| }).success(function (data) { | |
| writerLayer.show(data); | |
| centerLayer(); | |
| loadAltchaModule(); | |
| }).error(function (e) { | |
| if(e.responseText) | |
| alert(e.responseText); | |
변경 전gd_board_view.js
| */ | |
| $(document).ready(function () { | |
| $('img.js-smart-img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| */ | |
| $(document).ready(function () { | |
| $('img.js-smart-img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 후gd_board_view.js
| */ | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| $('img.js-smart-img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| */ | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| $('img.js-smart-img').each(function () { | |
| $(this).css('max-width', '100%'); | |
| }); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if ($('#secretReplyModify').is(":checked") || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 전gd_board_write.js
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| function addUpload() { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount >= 10) { | |
| alert(__("업로드는 최대 10개만 지원합니다")); | |
| return; | |
| } | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight + 33); | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| var bdId = $('[name="bdId"]').val(); | |
| var target = $(obj); | |
| index = target.prevAll('input:file').attr('index'); //$('.file-upload button.uploadremove').index(target)+1; | |
| var saveFileNm = $("input[name='saveFileNm[" + index + "]']").val(); | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight - 33); | |
| target.closest('.file-upload').remove(); | |
| // 파일 없음 처리 | |
| if (!saveFileNm) return; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: { | |
| mode: 'deleteUploadImage', | |
| bdId: bdId, | |
| saveFileNm: saveFileNm | |
| }, | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); // 삭제된 uploadFileNm 값 제거 | |
| $("input[name='saveFileNm[" + index + "]']").remove(); // 삭제된 saveFileNm 값 제거 | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| } | |
| var boardSuubmitFl = true; | |
| $(document).ready(function () { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| if ($('.file-upload').length > 10) { | |
| $('.file-upload:last').remove(); | |
| } | |
| $.validator.addMethod("checkCaptcha", function (value, element, fl) { | |
| var success = false; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'captcha', 'captchaKey': value }, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| if (result == 'true') { | |
| success = true; | |
| } | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| return success; | |
| }, __("자동등록방지 문자가 틀렸습니다.")); | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| form.submit(); | |
| boardSuubmitFl = false; | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: { | |
| required: true, | |
| checkCaptcha : true, | |
| }, | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| oEditors.getById["editor"].exec("SET_IR", ['']); | |
| oEditors.getById["editor"].exec("PASTE_HTML", [result]); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.selected-info-text').show(); | |
| }) | |
| $('.btn-open-layer').bind('click', function (e) { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| if ($(this).attr('href') == '#addGoodsLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_goods_select.php", | |
| success: function (data) { | |
| $('#addGoodsLayer').empty().append(data); | |
| $('#addGoodsLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| else if ($(this).attr('href') == '#addOrderLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_order_select.php", | |
| success: function (data) { | |
| $('#addOrderLayer').empty().append(data); | |
| $('#addOrderLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| }); | |
| $(document).on("change", "input:file", function () { | |
| var thisObj = $(this); | |
| var name = this.name; | |
| var idx = $('input[name="' + name + '"]').index(this); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| thisObj.attr('index',data.index); | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && name == 'upfiles[]') { | |
| $('input[name="' + name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| }); | |
| }); | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice,goodsNo : val.goodsNo}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| function addUpload() { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount >= 10) { | |
| alert(__("업로드는 최대 10개만 지원합니다")); | |
| return; | |
| } | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight + 33); | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| var bdId = $('[name="bdId"]').val(); | |
| var target = $(obj); | |
| index = target.prevAll('input:file').attr('index'); //$('.file-upload button.uploadremove').index(target)+1; | |
| var saveFileNm = $("input[name='saveFileNm[" + index + "]']").val(); | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight - 33); | |
| target.closest('.file-upload').remove(); | |
| // 파일 없음 처리 | |
| if (!saveFileNm) return; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: { | |
| mode: 'deleteUploadImage', | |
| bdId: bdId, | |
| saveFileNm: saveFileNm | |
| }, | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); // 삭제된 uploadFileNm 값 제거 | |
| $("input[name='saveFileNm[" + index + "]']").remove(); // 삭제된 saveFileNm 값 제거 | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| } | |
| var boardSuubmitFl = true; | |
| $(document).ready(function () { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| if ($('.file-upload').length > 10) { | |
| $('.file-upload:last').remove(); | |
| } | |
| $.validator.addMethod("checkCaptcha", function (value, element, fl) { | |
| var success = false; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'captcha', 'captchaKey': value }, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| if (result == 'true') { | |
| success = true; | |
| } | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| return success; | |
| }, __("자동등록방지 문자가 틀렸습니다.")); | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| form.submit(); | |
| boardSuubmitFl = false; | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: { | |
| required: true, | |
| checkCaptcha : true, | |
| }, | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| oEditors.getById["editor"].exec("SET_IR", ['']); | |
| oEditors.getById["editor"].exec("PASTE_HTML", [result]); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.selected-info-text').show(); | |
| }) | |
| $('.btn-open-layer').bind('click', function (e) { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| if ($(this).attr('href') == '#addGoodsLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_goods_select.php", | |
| success: function (data) { | |
| $('#addGoodsLayer').empty().append(data); | |
| $('#addGoodsLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| else if ($(this).attr('href') == '#addOrderLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_order_select.php", | |
| success: function (data) { | |
| $('#addOrderLayer').empty().append(data); | |
| $('#addOrderLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| }); | |
| $(document).on("change", "input:file", function () { | |
| var thisObj = $(this); | |
| var name = this.name; | |
| var idx = $('input[name="' + name + '"]').index(this); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| thisObj.attr('index',data.index); | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && name == 'upfiles[]') { | |
| $('input[name="' + name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| }); | |
| }); | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice,goodsNo : val.goodsNo}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
변경 후gd_board_write.js
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| function addUpload() { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount >= 10) { | |
| alert(__("업로드는 최대 10개만 지원합니다")); | |
| return; | |
| } | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight + 33); | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| var bdId = $('[name="bdId"]').val(); | |
| var target = $(obj); | |
| index = target.prevAll('input:file').attr('index'); //$('.file-upload button.uploadremove').index(target)+1; | |
| var saveFileNm = $("input[name='saveFileNm[" + index + "]']").val(); | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight - 33); | |
| target.closest('.file-upload').remove(); | |
| // 파일 없음 처리 | |
| if (!saveFileNm) return; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: { | |
| mode: 'deleteUploadImage', | |
| bdId: bdId, | |
| saveFileNm: saveFileNm | |
| }, | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); // 삭제된 uploadFileNm 값 제거 | |
| $("input[name='saveFileNm[" + index + "]']").remove(); // 삭제된 saveFileNm 값 제거 | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| } | |
| var boardSuubmitFl = true; | |
| $(document).ready(function () { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| if ($('.file-upload').length > 10) { | |
| $('.file-upload:last').remove(); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| form.submit(); | |
| boardSuubmitFl = false; | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| oEditors.getById["editor"].exec("SET_IR", ['']); | |
| oEditors.getById["editor"].exec("PASTE_HTML", [result]); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.selected-info-text').show(); | |
| }) | |
| $('.btn-open-layer').bind('click', function (e) { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| if ($(this).attr('href') == '#addGoodsLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_goods_select.php", | |
| success: function (data) { | |
| $('#addGoodsLayer').empty().append(data); | |
| $('#addGoodsLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| else if ($(this).attr('href') == '#addOrderLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_order_select.php", | |
| success: function (data) { | |
| $('#addOrderLayer').empty().append(data); | |
| $('#addOrderLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| }); | |
| $(document).on("change", "input:file", function () { | |
| var thisObj = $(this); | |
| var name = this.name; | |
| var idx = $('input[name="' + name + '"]').index(this); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| thisObj.attr('index',data.index); | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && name == 'upfiles[]') { | |
| $('input[name="' + name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| }); | |
| }); | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice,goodsNo : val.goodsNo}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| function addUpload() { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount >= 10) { | |
| alert(__("업로드는 최대 10개만 지원합니다")); | |
| return; | |
| } | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight + 33); | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| var bdId = $('[name="bdId"]').val(); | |
| var target = $(obj); | |
| index = target.prevAll('input:file').attr('index'); //$('.file-upload button.uploadremove').index(target)+1; | |
| var saveFileNm = $("input[name='saveFileNm[" + index + "]']").val(); | |
| var ifrmObj = $(window.frameElement); | |
| var ifrmHeight = ifrmObj.height(); | |
| ifrmObj.height(ifrmHeight - 33); | |
| target.closest('.file-upload').remove(); | |
| // 파일 없음 처리 | |
| if (!saveFileNm) return; | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: { | |
| mode: 'deleteUploadImage', | |
| bdId: bdId, | |
| saveFileNm: saveFileNm | |
| }, | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); // 삭제된 uploadFileNm 값 제거 | |
| $("input[name='saveFileNm[" + index + "]']").remove(); // 삭제된 saveFileNm 값 제거 | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| } | |
| var boardSuubmitFl = true; | |
| $(document).ready(function () { | |
| var uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| if ($('.file-upload').length > 10) { | |
| $('.file-upload:last').remove(); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSuubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| form.submit(); | |
| boardSuubmitFl = false; | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('개인정보 수집 및 이용동의를 체크해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| oEditors.getById["editor"].exec("SET_IR", ['']); | |
| oEditors.getById["editor"].exec("PASTE_HTML", [result]); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.selected-info-text').show(); | |
| }) | |
| $('.btn-open-layer').bind('click', function (e) { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| if ($(this).attr('href') == '#addGoodsLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_goods_select.php", | |
| success: function (data) { | |
| $('#addGoodsLayer').empty().append(data); | |
| $('#addGoodsLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| else if ($(this).attr('href') == '#addOrderLayer') { | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_order_select.php", | |
| success: function (data) { | |
| $('#addOrderLayer').empty().append(data); | |
| $('#addOrderLayer').find('>div').center(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| closeLayer(); | |
| } | |
| }); | |
| } | |
| }); | |
| $(document).on("change", "input:file", function () { | |
| var thisObj = $(this); | |
| var name = this.name; | |
| var idx = $('input[name="' + name + '"]').index(this); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| thisObj.attr('index',data.index); | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && name == 'upfiles[]') { | |
| $('input[name="' + name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| }); | |
| }); | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectGoodsTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice,goodsNo : val.goodsNo}; | |
| selectGoodstblTrHtml = selectGoodsTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selectGoodstblTrHtml); | |
| $('.selected-info-text').hide(); | |
| if(parent && parent!=this){ | |
| parent.resize_frame(parent.document.getElementsByName(window.name)[0]); | |
| } | |
| } | |
변경 전gd_common.js
| (obj).height = iframeHeight + 80; | |
| } | |
| /** | |
| * 회원다운로드 쿠폰 링크 다운 받기 | |
| * | |
변경 후gd_common.js
| (obj).height = iframeHeight + 80; | |
| } | |
| /* iframe(mypage 등)으로 board 목록이 실릴 때, onload 1회 측정(resize_frame/gd_resize_frame) 이후에도 | |
| 댓글/답글 폼 토글, ALTCHA 위젯 지연 렌더, 댓글 등록/삭제 등으로 내용 높이가 바뀌면 | |
| 부모 iframe 높이를 다시 맞춘다. body 높이가 실제로 변했을 때만 호출해 재측정 루프를 방지. */ | |
| (function () { | |
| let parentResize; | |
| try { | |
| if (window.parent === window) { | |
| return; // 최상위 문서 → 대상 아님 | |
| } | |
| parentResize = window.parent.gd_resize_frame || window.parent.resize_frame; | |
| } catch (e) { | |
| return; // cross-origin 부모 → 접근 불가, 대상 아님 | |
| } | |
| if (typeof parentResize !== 'function' || typeof window.ResizeObserver === 'undefined') { | |
| return; | |
| } | |
| const startObserve = function () { | |
| const frameEl = window.frameElement | |
| || (window.name ? window.parent.document.getElementsByName(window.name)[0] : null); | |
| if (!frameEl || !document.body) { | |
| return; | |
| } | |
| let timer = null; | |
| let lastHeight = -1; | |
| const observer = new ResizeObserver(function () { | |
| if (timer) { | |
| clearTimeout(timer); | |
| } | |
| timer = setTimeout(function () { | |
| const height = document.body.clientHeight; | |
| if (height === lastHeight) { | |
| return; // 실제 콘텐츠 높이 변화 없음 → 재측정 루프 방지 | |
| } | |
| lastHeight = height; | |
| parentResize.call(window.parent, frameEl); | |
| }, 100); | |
| }); | |
| observer.observe(document.body); | |
| }; | |
| if (document.body) { | |
| startObserve(); | |
| } else { | |
| document.addEventListener('DOMContentLoaded', startObserve); | |
| } | |
| })(); | |
| /** | |
| * 회원다운로드 쿠폰 링크 다운 받기 | |
| * | |
변경 전gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| $('.btn-join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.'), | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| $('.btn-join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
변경 후gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $('.btn-join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| email: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $('.btn-join').attr("disabled", true); | |
| form.submit(); | |
| } else { | |
변경 전join.html
| </form> | |
| </div> | |
| </div> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
| </form> | |
| </div> | |
| </div> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
변경 후join.html
| </form> | |
| </div> | |
| </div> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
| </form> | |
| </div> | |
| </div> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
변경 전_join_view_captcha.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" id="reload_captcha" class="normal-btn small1 captchareload"><em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br/>')}</p> | |
| </div> | |
| <div class="txt-field hs" style="width:105px;"> | |
| <input type="text" class="text captcha" name="captchaKey" maxlength="5" onKeyUp="javascript:this.value=this.value.toUpperCase();" onfocus="this.select()" label="{=__('자동등록방지문자')}"> | |
| </div> | |
| <button type="button" id="reload_captcha" class="normal-btn small1 captchareload"><em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </td> | |
| </tr> | |
| </tbody> | |
변경 후_join_view_captcha.html
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| </tbody> | |
| <tr> | |
| <th class="ta-l">{=__('자동등록방지')}</th> | |
| <td> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </td> | |
| </tr> | |
| </tbody> | |
변경 전_altcha.html
변경 후_altcha.html
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Front\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼(goods_board_write)에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Front\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼(goods_board_write)에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
변경 전view.html
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전view.html
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전view.html
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동방지등록 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동방지등록 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전goods_board_qa_list.html
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 후goods_board_qa_list.html
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 전goods_board_review_list.html
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 후goods_board_review_list.html
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 전goods_board_view.html
| </div> | |
| </div> | |
| </div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="자동등록방지 이미지"></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="captcha"> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="이미지 새로고침"> 이미지 새로고침</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| <!-- 비회원 개인정보 수집동의 // --> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="자동등록방지 이미지"></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="captcha"> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="이미지 새로고침"> 이미지 새로고침</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| <!--{:}--> | |
| <div class="comment_write js_form_write"> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="자동등록방지 이미지"></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="captcha"> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="이미지 새로고침"> 이미지 새로고침</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| <!-- 비회원 개인정보 수집동의 // --> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"> | |
| <span><img src="../board/captcha.php" class="captchaImg" alt="자동등록방지 이미지"></span> | |
| </div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="captcha"> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="이미지 새로고침"> 이미지 새로고침</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| </div> | |
| <!--{:}--> | |
| <div class="comment_write js_form_write"> | |
변경 후goods_board_view.html
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!-- 비회원 개인정보 수집동의 // --> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!--{:}--> | |
| <div class="comment_write js_form_write"> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!-- 비회원 개인정보 수집동의 // --> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!--{:}--> | |
| <div class="comment_write js_form_write"> | |
변경 전goods_view.html
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
변경 후goods_view.html
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
변경 전altcha.js
변경 후altcha.js
| const DEV = false; | |
| var is_array = Array.isArray; | |
| var index_of = Array.prototype.indexOf; | |
| var includes = Array.prototype.includes; | |
| var array_from = Array.from; | |
| var object_keys = Object.keys; | |
| var define_property = Object.defineProperty; | |
| var get_descriptor = Object.getOwnPropertyDescriptor; | |
| var get_descriptors = Object.getOwnPropertyDescriptors; | |
| var object_prototype = Object.prototype; | |
| var array_prototype = Array.prototype; | |
| var get_prototype_of = Object.getPrototypeOf; | |
| var is_extensible = Object.isExtensible; | |
| const noop = () => { | |
| }; | |
| function run_all(arr) { | |
| for (var i = 0; i < arr.length; i++) { | |
| arr[i](); | |
| } | |
| } | |
| function deferred() { | |
| var resolve; | |
| var reject; | |
| var promise = new Promise((res, rej) => { | |
| resolve = res; | |
| reject = rej; | |
| }); | |
| return { promise, resolve, reject }; | |
| } | |
| const DERIVED = 1 << 1; | |
| const EFFECT = 1 << 2; | |
| const RENDER_EFFECT = 1 << 3; | |
| const MANAGED_EFFECT = 1 << 24; | |
| const BLOCK_EFFECT = 1 << 4; | |
| const BRANCH_EFFECT = 1 << 5; | |
| const ROOT_EFFECT = 1 << 6; | |
| const BOUNDARY_EFFECT = 1 << 7; | |
| const CONNECTED = 1 << 9; | |
| const CLEAN = 1 << 10; | |
| const DIRTY = 1 << 11; | |
| const MAYBE_DIRTY = 1 << 12; | |
| const INERT = 1 << 13; | |
| const DESTROYED = 1 << 14; | |
| const REACTION_RAN = 1 << 15; | |
| const DESTROYING = 1 << 25; | |
| const EFFECT_TRANSPARENT = 1 << 16; | |
| const EAGER_EFFECT = 1 << 17; | |
| const HEAD_EFFECT = 1 << 18; | |
| const EFFECT_PRESERVED = 1 << 19; | |
| const USER_EFFECT = 1 << 20; | |
| const WAS_MARKED = 1 << 16; | |
| const REACTION_IS_UPDATING = 1 << 21; | |
| const ASYNC = 1 << 22; | |
| const ERROR_VALUE = 1 << 23; | |
| const STATE_SYMBOL = /* @__PURE__ */ Symbol("$state"); | |
| const LEGACY_PROPS = /* @__PURE__ */ Symbol("legacy props"); | |
| const LOADING_ATTR_SYMBOL = /* @__PURE__ */ Symbol(""); | |
| const ATTRIBUTES_CACHE = /* @__PURE__ */ Symbol("attributes"); | |
| const CLASS_CACHE = /* @__PURE__ */ Symbol("class"); | |
| const STYLE_CACHE = /* @__PURE__ */ Symbol("style"); | |
| const TEXT_CACHE = /* @__PURE__ */ Symbol("text"); | |
| const FORM_RESET_HANDLER = /* @__PURE__ */ Symbol("form reset"); | |
| const STALE_REACTION = new class StaleReactionError extends Error { | |
| name = "StaleReactionError"; | |
| message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; | |
| }(); | |
| const IS_XHTML = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| !!globalThis.document?.contentType && /* @__PURE__ */ globalThis.document.contentType.includes("xml") | |
| ); | |
| const TEXT_NODE = 3; | |
| const COMMENT_NODE = 8; | |
| function equals(value) { | |
| return value === this.v; | |
| } | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function safe_equals(value) { | |
| return !safe_not_equal(value, this.v); | |
| } | |
| function lifecycle_outside_component(name) { | |
| { | |
| throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); | |
| } | |
| } | |
| function async_derived_orphan() { | |
| { | |
| throw new Error(`https://svelte.dev/e/async_derived_orphan`); | |
| } | |
| } | |
| function effect_in_teardown(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_teardown`); | |
| } | |
| } | |
| function effect_in_unowned_derived() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); | |
| } | |
| } | |
| function effect_orphan(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_orphan`); | |
| } | |
| } | |
| function effect_update_depth_exceeded() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); | |
| } | |
| } | |
| function hydration_failed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/hydration_failed`); | |
| } | |
| } | |
| function state_descriptors_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); | |
| } | |
| } | |
| function state_prototype_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_prototype_fixed`); | |
| } | |
| } | |
| function state_unsafe_mutation() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); | |
| } | |
| } | |
| function svelte_boundary_reset_onerror() { | |
| { | |
| throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); | |
| } | |
| } | |
| let tracing_mode_flag = false; | |
| const TEMPLATE_FRAGMENT = 1; | |
| const TEMPLATE_USE_IMPORT_NODE = 1 << 1; | |
| const HYDRATION_START = "["; | |
| const HYDRATION_START_ELSE = "[!"; | |
| const HYDRATION_START_FAILED = "[?"; | |
| const HYDRATION_END = "]"; | |
| const HYDRATION_ERROR = {}; | |
| const UNINITIALIZED = /* @__PURE__ */ Symbol("uninitialized"); | |
| const NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; | |
| const NAMESPACE_SVG = "http://www.w3.org/2000/svg"; | |
| const NAMESPACE_MATHML = "http://www.w3.org/1998/Math/MathML"; | |
| const ATTACHMENT_KEY = "@attach"; | |
| let component_context = null; | |
| function set_component_context(context) { | |
| component_context = context; | |
| } | |
| function push(props, runes = false, fn) { | |
| component_context = { | |
| p: component_context, | |
| i: false, | |
| c: null, | |
| e: null, | |
| s: props, | |
| x: null, | |
| r: ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ), | |
| l: null | |
| }; | |
| } | |
| function pop(component2) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| var effects = context.e; | |
| if (effects !== null) { | |
| context.e = null; | |
| for (var fn of effects) { | |
| create_user_effect(fn); | |
| } | |
| } | |
| if (component2 !== void 0) { | |
| context.x = component2; | |
| } | |
| context.i = true; | |
| component_context = context.p; | |
| return component2 ?? /** @type {T} */ | |
| {}; | |
| } | |
| function is_runes() { | |
| return true; | |
| } | |
| let micro_tasks = []; | |
| function run_micro_tasks() { | |
| var tasks = micro_tasks; | |
| micro_tasks = []; | |
| run_all(tasks); | |
| } | |
| function queue_micro_task(fn) { | |
| if (micro_tasks.length === 0 && !is_flushing_sync) { | |
| var tasks = micro_tasks; | |
| queueMicrotask(() => { | |
| if (tasks === micro_tasks) run_micro_tasks(); | |
| }); | |
| } | |
| micro_tasks.push(fn); | |
| } | |
| function flush_tasks() { | |
| while (micro_tasks.length > 0) { | |
| run_micro_tasks(); | |
| } | |
| } | |
| function derived_inert() { | |
| { | |
| console.warn(`https://svelte.dev/e/derived_inert`); | |
| } | |
| } | |
| function hydration_mismatch(location2) { | |
| { | |
| console.warn(`https://svelte.dev/e/hydration_mismatch`); | |
| } | |
| } | |
| function select_multiple_invalid_value() { | |
| { | |
| console.warn(`https://svelte.dev/e/select_multiple_invalid_value`); | |
| } | |
| } | |
| function svelte_boundary_reset_noop() { | |
| { | |
| console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`); | |
| } | |
| } | |
| let hydrating = false; | |
| function set_hydrating(value) { | |
| hydrating = value; | |
| } | |
| let hydrate_node; | |
| function set_hydrate_node(node) { | |
| if (node === null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return hydrate_node = node; | |
| } | |
| function hydrate_next() { | |
| return set_hydrate_node(/* @__PURE__ */ get_next_sibling(hydrate_node)); | |
| } | |
| function reset(node) { | |
| if (!hydrating) return; | |
| if (/* @__PURE__ */ get_next_sibling(hydrate_node) !== null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| hydrate_node = node; | |
| } | |
| function next(count = 1) { | |
| if (hydrating) { | |
| var i = count; | |
| var node = hydrate_node; | |
| while (i--) { | |
| node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node); | |
| } | |
| hydrate_node = node; | |
| } | |
| } | |
| function skip_nodes(remove = true) { | |
| var depth = 0; | |
| var node = hydrate_node; | |
| while (true) { | |
| if (node.nodeType === COMMENT_NODE) { | |
| var data = ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| if (data === HYDRATION_END) { | |
| if (depth === 0) return node; | |
| depth -= 1; | |
| } else if (data === HYDRATION_START || data === HYDRATION_START_ELSE || // "[1", "[2", etc. for if blocks | |
| data[0] === "[" && !isNaN(Number(data.slice(1)))) { | |
| depth += 1; | |
| } | |
| } | |
| var next2 = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node) | |
| ); | |
| if (remove) node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function read_hydration_instruction(node) { | |
| if (!node || node.nodeType !== COMMENT_NODE) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| } | |
| function proxy(value) { | |
| if (typeof value !== "object" || value === null || STATE_SYMBOL in value) { | |
| return value; | |
| } | |
| const prototype = get_prototype_of(value); | |
| if (prototype !== object_prototype && prototype !== array_prototype) { | |
| return value; | |
| } | |
| var sources = /* @__PURE__ */ new Map(); | |
| var is_proxied_array = is_array(value); | |
| var version = /* @__PURE__ */ state(0); | |
| var parent_version = update_version; | |
| var with_parent = (fn) => { | |
| if (update_version === parent_version) { | |
| return fn(); | |
| } | |
| var reaction = active_reaction; | |
| var version2 = update_version; | |
| set_active_reaction(null); | |
| set_update_version(parent_version); | |
| var result = fn(); | |
| set_active_reaction(reaction); | |
| set_update_version(version2); | |
| return result; | |
| }; | |
| if (is_proxied_array) { | |
| sources.set("length", /* @__PURE__ */ state( | |
| /** @type {any[]} */ | |
| value.length | |
| )); | |
| } | |
| return new Proxy( | |
| /** @type {any} */ | |
| value, | |
| { | |
| defineProperty(_, prop2, descriptor) { | |
| if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) { | |
| state_descriptors_fixed(); | |
| } | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| with_parent(() => { | |
| var s2 = /* @__PURE__ */ state(descriptor.value); | |
| sources.set(prop2, s2); | |
| return s2; | |
| }); | |
| } else { | |
| set(s, descriptor.value, true); | |
| } | |
| return true; | |
| }, | |
| deleteProperty(target, prop2) { | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| if (prop2 in target) { | |
| const s2 = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(prop2, s2); | |
| increment(version); | |
| } | |
| } else { | |
| set(s, UNINITIALIZED); | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| get(target, prop2, receiver) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return value; | |
| } | |
| var s = sources.get(prop2); | |
| var exists = prop2 in target; | |
| if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) { | |
| s = with_parent(() => { | |
| var p = proxy(exists ? target[prop2] : UNINITIALIZED); | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| if (s !== void 0) { | |
| var v = get(s); | |
| return v === UNINITIALIZED ? void 0 : v; | |
| } | |
| return Reflect.get(target, prop2, receiver); | |
| }, | |
| getOwnPropertyDescriptor(target, prop2) { | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor && "value" in descriptor) { | |
| var s = sources.get(prop2); | |
| if (s) descriptor.value = get(s); | |
| } else if (descriptor === void 0) { | |
| var source2 = sources.get(prop2); | |
| var value2 = source2?.v; | |
| if (source2 !== void 0 && value2 !== UNINITIALIZED) { | |
| return { | |
| enumerable: true, | |
| configurable: true, | |
| value: value2, | |
| writable: true | |
| }; | |
| } | |
| } | |
| return descriptor; | |
| }, | |
| has(target, prop2) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return true; | |
| } | |
| var s = sources.get(prop2); | |
| var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2); | |
| if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) { | |
| if (s === void 0) { | |
| s = with_parent(() => { | |
| var p = has ? proxy(target[prop2]) : UNINITIALIZED; | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| var value2 = get(s); | |
| if (value2 === UNINITIALIZED) { | |
| return false; | |
| } | |
| } | |
| return has; | |
| }, | |
| set(target, prop2, value2, receiver) { | |
| var s = sources.get(prop2); | |
| var has = prop2 in target; | |
| if (is_proxied_array && prop2 === "length") { | |
| for (var i = value2; i < /** @type {Source<number>} */ | |
| s.v; i += 1) { | |
| var other_s = sources.get(i + ""); | |
| if (other_s !== void 0) { | |
| set(other_s, UNINITIALIZED); | |
| } else if (i in target) { | |
| other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(i + "", other_s); | |
| } | |
| } | |
| } | |
| if (s === void 0) { | |
| if (!has || get_descriptor(target, prop2)?.writable) { | |
| s = with_parent(() => /* @__PURE__ */ state(void 0)); | |
| set(s, proxy(value2)); | |
| sources.set(prop2, s); | |
| } | |
| } else { | |
| has = s.v !== UNINITIALIZED; | |
| var p = with_parent(() => proxy(value2)); | |
| set(s, p); | |
| } | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor?.set) { | |
| descriptor.set.call(receiver, value2); | |
| } | |
| if (!has) { | |
| if (is_proxied_array && typeof prop2 === "string") { | |
| var ls = ( | |
| /** @type {Source<number>} */ | |
| sources.get("length") | |
| ); | |
| var n = Number(prop2); | |
| if (Number.isInteger(n) && n >= ls.v) { | |
| set(ls, n + 1); | |
| } | |
| } | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| ownKeys(target) { | |
| get(version); | |
| var own_keys = Reflect.ownKeys(target).filter((key3) => { | |
| var source3 = sources.get(key3); | |
| return source3 === void 0 || source3.v !== UNINITIALIZED; | |
| }); | |
| for (var [key2, source2] of sources) { | |
| if (source2.v !== UNINITIALIZED && !(key2 in target)) { | |
| own_keys.push(key2); | |
| } | |
| } | |
| return own_keys; | |
| }, | |
| setPrototypeOf() { | |
| state_prototype_fixed(); | |
| } | |
| } | |
| ); | |
| } | |
| function get_proxied_value(value) { | |
| try { | |
| if (value !== null && typeof value === "object" && STATE_SYMBOL in value) { | |
| return value[STATE_SYMBOL]; | |
| } | |
| } catch { | |
| } | |
| return value; | |
| } | |
| function is(a, b) { | |
| return Object.is(get_proxied_value(a), get_proxied_value(b)); | |
| } | |
| var $window; | |
| var $document; | |
| var is_firefox; | |
| var first_child_getter; | |
| var next_sibling_getter; | |
| function init_operations() { | |
| if ($window !== void 0) { | |
| return; | |
| } | |
| $window = window; | |
| $document = document; | |
| is_firefox = /Firefox/.test(navigator.userAgent); | |
| var element_prototype = Element.prototype; | |
| var node_prototype = Node.prototype; | |
| var text_prototype = Text.prototype; | |
| first_child_getter = get_descriptor(node_prototype, "firstChild").get; | |
| next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; | |
| if (is_extensible(element_prototype)) { | |
| element_prototype[CLASS_CACHE] = void 0; | |
| element_prototype[ATTRIBUTES_CACHE] = null; | |
| element_prototype[STYLE_CACHE] = void 0; | |
| element_prototype.__e = void 0; | |
| } | |
| if (is_extensible(text_prototype)) { | |
| text_prototype[TEXT_CACHE] = void 0; | |
| } | |
| } | |
| function create_text(value = "") { | |
| return document.createTextNode(value); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_first_child(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| first_child_getter.call(node) | |
| ); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_next_sibling(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| next_sibling_getter.call(node) | |
| ); | |
| } | |
| function child(node, is_text) { | |
| if (!hydrating) { | |
| return /* @__PURE__ */ get_first_child(node); | |
| } | |
| var child2 = /* @__PURE__ */ get_first_child(hydrate_node); | |
| if (child2 === null) { | |
| child2 = hydrate_node.appendChild(create_text()); | |
| } else if (is_text && child2.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| child2?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| if (is_text) { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| child2 | |
| ); | |
| } | |
| set_hydrate_node(child2); | |
| return child2; | |
| } | |
| function first_child(node, is_text = false) { | |
| if (!hydrating) { | |
| var first = /* @__PURE__ */ get_first_child(node); | |
| if (first instanceof Comment && first.data === "") return /* @__PURE__ */ get_next_sibling(first); | |
| return first; | |
| } | |
| if (is_text) { | |
| if (hydrate_node?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| hydrate_node?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| hydrate_node | |
| ); | |
| } | |
| return hydrate_node; | |
| } | |
| function sibling(node, count = 1, is_text = false) { | |
| let next_sibling = hydrating ? hydrate_node : node; | |
| var last_sibling; | |
| while (count--) { | |
| last_sibling = next_sibling; | |
| next_sibling = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(next_sibling); | |
| } | |
| if (!hydrating) { | |
| return next_sibling; | |
| } | |
| if (is_text) { | |
| if (next_sibling?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| if (next_sibling === null) { | |
| last_sibling?.after(text2); | |
| } else { | |
| next_sibling.before(text2); | |
| } | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| next_sibling | |
| ); | |
| } | |
| set_hydrate_node(next_sibling); | |
| return next_sibling; | |
| } | |
| function clear_text_content(node) { | |
| node.textContent = ""; | |
| } | |
| function should_defer_append() { | |
| return false; | |
| } | |
| function create_element(tag, namespace, is2) { | |
| let options = void 0; | |
| return ( | |
| /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ | |
| document.createElementNS(namespace ?? NAMESPACE_HTML, tag, options) | |
| ); | |
| } | |
| function merge_text_nodes(text2) { | |
| if ( | |
| /** @type {string} */ | |
| text2.nodeValue.length < 65536 | |
| ) { | |
| return; | |
| } | |
| let next2 = text2.nextSibling; | |
| while (next2 !== null && next2.nodeType === TEXT_NODE) { | |
| next2.remove(); | |
| text2.nodeValue += /** @type {string} */ | |
| next2.nodeValue; | |
| next2 = text2.nextSibling; | |
| } | |
| } | |
| function handle_error(error) { | |
| var effect2 = active_effect; | |
| if (effect2 === null) { | |
| active_reaction.f |= ERROR_VALUE; | |
| return error; | |
| } | |
| if ((effect2.f & REACTION_RAN) === 0 && (effect2.f & EFFECT) === 0) { | |
| throw error; | |
| } | |
| invoke_error_boundary(error, effect2); | |
| } | |
| function invoke_error_boundary(error, effect2) { | |
| while (effect2 !== null) { | |
| if ((effect2.f & BOUNDARY_EFFECT) !== 0) { | |
| if ((effect2.f & REACTION_RAN) === 0) { | |
| throw error; | |
| } | |
| try { | |
| effect2.b.error(error); | |
| return; | |
| } catch (e) { | |
| error = e; | |
| } | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| throw error; | |
| } | |
| const STATUS_MASK = -7169; | |
| function set_signal_status(signal, status) { | |
| signal.f = signal.f & STATUS_MASK | status; | |
| } | |
| function update_derived_status(derived2) { | |
| if ((derived2.f & CONNECTED) !== 0 || derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| } else { | |
| set_signal_status(derived2, MAYBE_DIRTY); | |
| } | |
| } | |
| function clear_marked(deps) { | |
| if (deps === null) return; | |
| for (const dep of deps) { | |
| if ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) { | |
| continue; | |
| } | |
| dep.f ^= WAS_MARKED; | |
| clear_marked( | |
| /** @type {Derived} */ | |
| dep.deps | |
| ); | |
| } | |
| } | |
| function defer_effect(effect2, dirty_effects, maybe_dirty_effects) { | |
| if ((effect2.f & DIRTY) !== 0) { | |
| dirty_effects.add(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| maybe_dirty_effects.add(effect2); | |
| } | |
| clear_marked(effect2.deps); | |
| set_signal_status(effect2, CLEAN); | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set2(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set2(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set2, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set: set2, update, subscribe }; | |
| } | |
| function get$1(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let IS_UNMOUNTED = /* @__PURE__ */ Symbol("unmounted"); | |
| function store_get(store2, store_name, stores) { | |
| const entry = stores[store_name] ??= { | |
| store: null, | |
| source: /* @__PURE__ */ mutable_source(void 0), | |
| unsubscribe: noop | |
| }; | |
| if (entry.store !== store2 && !(IS_UNMOUNTED in stores)) { | |
| entry.unsubscribe(); | |
| entry.store = store2 ?? null; | |
| if (store2 == null) { | |
| entry.source.v = void 0; | |
| entry.unsubscribe = noop; | |
| } else { | |
| var is_synchronous_callback = true; | |
| entry.unsubscribe = subscribe_to_store(store2, (v) => { | |
| if (is_synchronous_callback) { | |
| entry.source.v = v; | |
| } else { | |
| set(entry.source, v); | |
| } | |
| }); | |
| is_synchronous_callback = false; | |
| } | |
| } | |
| if (store2 && IS_UNMOUNTED in stores) { | |
| return get$1(store2); | |
| } | |
| return get(entry.source); | |
| } | |
| function setup_stores() { | |
| const stores = {}; | |
| function cleanup() { | |
| teardown(() => { | |
| for (var store_name in stores) { | |
| const ref = stores[store_name]; | |
| ref.unsubscribe(); | |
| } | |
| define_property(stores, IS_UNMOUNTED, { | |
| enumerable: false, | |
| value: true | |
| }); | |
| }); | |
| } | |
| return [stores, cleanup]; | |
| } | |
| let first_batch = null; | |
| let last_batch = null; | |
| let current_batch = null; | |
| let previous_batch = null; | |
| let batch_values = null; | |
| let last_scheduled_effect = null; | |
| let is_flushing_sync = false; | |
| let is_processing = false; | |
| let collected_effects = null; | |
| let legacy_updates = null; | |
| var flush_count = 0; | |
| var source_stacks = /* @__PURE__ */ new Set(); | |
| let uid = 1; | |
| class Batch { | |
| id = uid++; | |
| /** True as soon as `#process` was called */ | |
| #started = false; | |
| linked = true; | |
| /** @type {Batch | null} */ | |
| #prev = null; | |
| /** @type {Batch | null} */ | |
| #next = null; | |
| /** @type {Map<Effect, ReturnType<typeof deferred<any>>>} */ | |
| async_deriveds = /* @__PURE__ */ new Map(); | |
| /** | |
| * The current values of any signals that are updated in this batch. | |
| * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment) | |
| * They keys of this map are identical to `this.#previous` | |
| * @type {Map<Value, [any, boolean]>} | |
| */ | |
| current = /* @__PURE__ */ new Map(); | |
| /** | |
| * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place. | |
| * They keys of this map are identical to `this.#current` | |
| * @type {Map<Value, any>} | |
| */ | |
| previous = /* @__PURE__ */ new Map(); | |
| /** | |
| * Async effects which this batch doesn't take into account anymore when calculating blockers, | |
| * as it has a value for it already. | |
| * @type {Set<Effect>} | |
| */ | |
| unblocked = /* @__PURE__ */ new Set(); | |
| /** | |
| * When the batch is committed (and the DOM is updated), we need to remove old branches | |
| * and append new ones by calling the functions added inside (if/each/key/etc) blocks | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * If a fork is discarded, we need to destroy any effects that are no longer needed | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #discard_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * Callbacks that should run only when a fork is committed. | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #fork_commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * The number of async effects that are currently in flight | |
| */ | |
| #pending = 0; | |
| /** | |
| * Async effects that are currently in flight, _not_ inside a pending boundary | |
| * @type {Map<Effect, number>} | |
| */ | |
| #blocking_pending = /* @__PURE__ */ new Map(); | |
| /** | |
| * A deferred that resolves when the batch is committed, used with `settled()` | |
| * TODO replace with Promise.withResolvers once supported widely enough | |
| * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null} | |
| */ | |
| #deferred = null; | |
| /** | |
| * The root effects that need to be flushed | |
| * @type {Effect[]} | |
| */ | |
| #roots = []; | |
| /** | |
| * Effects created while this batch was active. | |
| * @type {Effect[]} | |
| */ | |
| #new_effects = []; | |
| /** | |
| * Deferred effects (which run after async work has completed) that are DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * Deferred effects that are MAYBE_DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A map of branches that still exist, but will be destroyed when this batch | |
| * is committed — we skip over these during `process`. | |
| * The value contains child effects that were dirty/maybe_dirty before being reset, | |
| * so they can be rescheduled if the branch survives. | |
| * @type {Map<Effect, { d: Effect[], m: Effect[] }>} | |
| */ | |
| #skipped_branches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing | |
| * @type {Set<Effect>} | |
| */ | |
| #unskipped_branches = /* @__PURE__ */ new Set(); | |
| is_fork = false; | |
| #decrement_queued = false; | |
| #is_deferred() { | |
| if (this.is_fork) return true; | |
| for (const effect2 of this.#blocking_pending.keys()) { | |
| var e = effect2; | |
| var skipped = false; | |
| while (e.parent !== null) { | |
| if (this.#skipped_branches.has(e)) { | |
| skipped = true; | |
| break; | |
| } | |
| e = e.parent; | |
| } | |
| if (!skipped) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Add an effect to the #skipped_branches map and reset its children | |
| * @param {Effect} effect | |
| */ | |
| skip_effect(effect2) { | |
| if (!this.#skipped_branches.has(effect2)) { | |
| this.#skipped_branches.set(effect2, { d: [], m: [] }); | |
| } | |
| this.#unskipped_branches.delete(effect2); | |
| } | |
| /** | |
| * Remove an effect from the #skipped_branches map and reschedule | |
| * any tracked dirty/maybe_dirty child effects | |
| * @param {Effect} effect | |
| * @param {(e: Effect) => void} callback | |
| */ | |
| unskip_effect(effect2, callback = (e) => this.schedule(e)) { | |
| var tracked = this.#skipped_branches.get(effect2); | |
| if (tracked) { | |
| this.#skipped_branches.delete(effect2); | |
| for (var e of tracked.d) { | |
| set_signal_status(e, DIRTY); | |
| callback(e); | |
| } | |
| for (e of tracked.m) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| callback(e); | |
| } | |
| } | |
| this.#unskipped_branches.add(effect2); | |
| } | |
| #process() { | |
| this.#started = true; | |
| if (flush_count++ > 1e3) { | |
| this.#unlink(); | |
| infinite_loop_guard(); | |
| } | |
| if (!this.#is_deferred()) { | |
| for (const e of this.#dirty_effects) { | |
| this.#maybe_dirty_effects.delete(e); | |
| set_signal_status(e, DIRTY); | |
| this.schedule(e); | |
| } | |
| for (const e of this.#maybe_dirty_effects) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| this.schedule(e); | |
| } | |
| } | |
| const roots = this.#roots; | |
| this.#roots = []; | |
| this.apply(); | |
| var effects = collected_effects = []; | |
| var render_effects = []; | |
| var updates = legacy_updates = []; | |
| for (const root2 of roots) { | |
| try { | |
| this.#traverse(root2, effects, render_effects); | |
| } catch (e) { | |
| reset_all(root2); | |
| throw e; | |
| } | |
| } | |
| current_batch = null; | |
| if (updates.length > 0) { | |
| var batch = Batch.ensure(); | |
| for (const e of updates) { | |
| batch.schedule(e); | |
| } | |
| } | |
| collected_effects = null; | |
| legacy_updates = null; | |
| if (this.#is_deferred()) { | |
| this.#defer_effects(render_effects); | |
| this.#defer_effects(effects); | |
| for (const [e, t] of this.#skipped_branches) { | |
| reset_branch(e, t); | |
| } | |
| if (updates.length > 0) { | |
| /** @type {unknown} */ | |
| current_batch.#process(); | |
| } | |
| return; | |
| } | |
| const earlier_batch = this.#find_earlier_batch(); | |
| if (earlier_batch) { | |
| earlier_batch.#merge(this); | |
| return; | |
| } | |
| this.#dirty_effects.clear(); | |
| this.#maybe_dirty_effects.clear(); | |
| for (const fn of this.#commit_callbacks) fn(this); | |
| this.#commit_callbacks.clear(); | |
| previous_batch = this; | |
| flush_queued_effects(render_effects); | |
| flush_queued_effects(effects); | |
| previous_batch = null; | |
| this.#deferred?.resolve(); | |
| var next_batch = ( | |
| /** @type {Batch | null} */ | |
| /** @type {unknown} */ | |
| current_batch | |
| ); | |
| if (this.linked && this.#pending === 0) { | |
| this.#unlink(); | |
| } | |
| if (this.#roots.length > 0) { | |
| if (next_batch === null) { | |
| next_batch = this; | |
| this.#link(); | |
| } | |
| const batch2 = next_batch; | |
| batch2.#roots.push(...this.#roots.filter((r2) => !batch2.#roots.includes(r2))); | |
| } | |
| if (next_batch !== null) { | |
| next_batch.#process(); | |
| } | |
| } | |
| /** | |
| * Traverse the effect tree, executing effects or stashing | |
| * them for later execution as appropriate | |
| * @param {Effect} root | |
| * @param {Effect[]} effects | |
| * @param {Effect[]} render_effects | |
| */ | |
| #traverse(root2, effects, render_effects) { | |
| root2.f ^= CLEAN; | |
| var effect2 = root2.first; | |
| while (effect2 !== null) { | |
| var flags2 = effect2.f; | |
| var is_branch = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; | |
| var is_skippable_branch = is_branch && (flags2 & CLEAN) !== 0; | |
| var skip = is_skippable_branch || (flags2 & INERT) !== 0 || this.#skipped_branches.has(effect2); | |
| if (!skip && effect2.fn !== null) { | |
| if (is_branch) { | |
| effect2.f ^= CLEAN; | |
| } else if ((flags2 & EFFECT) !== 0) { | |
| effects.push(effect2); | |
| } else if (is_dirty(effect2)) { | |
| if ((flags2 & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect2); | |
| update_effect(effect2); | |
| } | |
| var child2 = effect2.first; | |
| if (child2 !== null) { | |
| effect2 = child2; | |
| continue; | |
| } | |
| } | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if (next2 !== null) { | |
| effect2 = next2; | |
| break; | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| } | |
| } | |
| #find_earlier_batch() { | |
| var batch = this.#prev; | |
| while (batch !== null) { | |
| if (!batch.is_fork) { | |
| for (const [value, [, is_derived]] of this.current) { | |
| if (batch.current.has(value) && !is_derived) { | |
| return batch; | |
| } | |
| } | |
| } | |
| batch = batch.#prev; | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #merge(batch) { | |
| for (const [source2, value] of batch.current) { | |
| if (!this.previous.has(source2) && batch.previous.has(source2)) { | |
| this.previous.set(source2, batch.previous.get(source2)); | |
| } | |
| this.current.set(source2, value); | |
| } | |
| for (const [effect2, deferred2] of batch.async_deriveds) { | |
| const d = this.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| const mark = (value) => { | |
| var reactions = value.reactions; | |
| if (reactions === null) return; | |
| for (const reaction of reactions) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| } else { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if (flags2 & (ASYNC | BLOCK_EFFECT) && !this.async_deriveds.has(effect2)) { | |
| this.#maybe_dirty_effects.delete(effect2); | |
| set_signal_status(effect2, DIRTY); | |
| this.schedule(effect2); | |
| } | |
| } | |
| } | |
| }; | |
| for (const source2 of this.current.keys()) { | |
| mark(source2); | |
| } | |
| this.oncommit(() => batch.discard()); | |
| batch.#unlink(); | |
| current_batch = this; | |
| this.#process(); | |
| } | |
| /** | |
| * @param {Effect[]} effects | |
| */ | |
| #defer_effects(effects) { | |
| for (var i = 0; i < effects.length; i += 1) { | |
| defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| } | |
| /** | |
| * Associate a change to a given source with the current | |
| * batch, noting its previous and current values | |
| * @param {Value} source | |
| * @param {any} value | |
| * @param {boolean} [is_derived] | |
| */ | |
| capture(source2, value, is_derived = false) { | |
| if (source2.v !== UNINITIALIZED && !this.previous.has(source2)) { | |
| this.previous.set(source2, source2.v); | |
| } | |
| if ((source2.f & ERROR_VALUE) === 0) { | |
| this.current.set(source2, [value, is_derived]); | |
| batch_values?.set(source2, value); | |
| } | |
| if (!this.is_fork) { | |
| source2.v = value; | |
| } | |
| } | |
| activate() { | |
| current_batch = this; | |
| } | |
| deactivate() { | |
| current_batch = null; | |
| batch_values = null; | |
| } | |
| flush() { | |
| try { | |
| if (DEV) ; | |
| is_processing = true; | |
| current_batch = this; | |
| this.#process(); | |
| } finally { | |
| flush_count = 0; | |
| last_scheduled_effect = null; | |
| collected_effects = null; | |
| legacy_updates = null; | |
| is_processing = false; | |
| current_batch = null; | |
| batch_values = null; | |
| old_values.clear(); | |
| } | |
| } | |
| discard() { | |
| for (const fn of this.#discard_callbacks) fn(this); | |
| this.#discard_callbacks.clear(); | |
| this.#fork_commit_callbacks.clear(); | |
| this.#unlink(); | |
| } | |
| /** | |
| * @param {Effect} effect | |
| */ | |
| register_created_effect(effect2) { | |
| this.#new_effects.push(effect2); | |
| } | |
| #commit() { | |
| this.#unlink(); | |
| for (let batch = first_batch; batch !== null; batch = batch.#next) { | |
| var is_earlier = batch.id < this.id; | |
| var sources = []; | |
| for (const [source3, [value, is_derived]] of this.current) { | |
| if (batch.current.has(source3)) { | |
| var batch_value = ( | |
| /** @type {[any, boolean]} */ | |
| batch.current.get(source3)[0] | |
| ); | |
| if (is_earlier && value !== batch_value) { | |
| batch.current.set(source3, [value, is_derived]); | |
| } else { | |
| continue; | |
| } | |
| } | |
| sources.push(source3); | |
| } | |
| if (is_earlier) { | |
| for (const [effect2, deferred2] of this.async_deriveds) { | |
| const d = batch.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| } | |
| if (!batch.#started) continue; | |
| var others = [...batch.current.keys()].filter((s) => !this.current.has(s)); | |
| if (others.length === 0) { | |
| if (is_earlier) { | |
| batch.discard(); | |
| } | |
| } else if (sources.length > 0) { | |
| if (is_earlier) { | |
| for (const unskipped of this.#unskipped_branches) { | |
| batch.unskip_effect(unskipped, (e) => { | |
| if ((e.f & (BLOCK_EFFECT | ASYNC)) !== 0) { | |
| batch.schedule(e); | |
| } else { | |
| batch.#defer_effects([e]); | |
| } | |
| }); | |
| } | |
| } | |
| batch.activate(); | |
| var marked = /* @__PURE__ */ new Set(); | |
| var checked = /* @__PURE__ */ new Map(); | |
| for (var source2 of sources) { | |
| mark_effects(source2, others, marked, checked); | |
| } | |
| checked = /* @__PURE__ */ new Map(); | |
| var current_unequal = [...batch.current.keys()].filter( | |
| (c) => this.current.has(c) ? ( | |
| /** @type {[any, boolean]} */ | |
| this.current.get(c)[0] !== c.v | |
| ) : true | |
| ); | |
| if (current_unequal.length > 0) { | |
| for (const effect2 of this.#new_effects) { | |
| if ((effect2.f & (DESTROYED | INERT | EAGER_EFFECT)) === 0 && depends_on(effect2, current_unequal, checked)) { | |
| if ((effect2.f & (ASYNC | BLOCK_EFFECT)) !== 0) { | |
| set_signal_status(effect2, DIRTY); | |
| batch.schedule(effect2); | |
| } else { | |
| batch.#dirty_effects.add(effect2); | |
| } | |
| } | |
| } | |
| } | |
| if (batch.#roots.length > 0) { | |
| batch.apply(); | |
| for (var root2 of batch.#roots) { | |
| batch.#traverse(root2, [], []); | |
| } | |
| batch.#roots = []; | |
| } | |
| batch.deactivate(); | |
| } | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| increment(blocking, effect2) { | |
| this.#pending += 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| this.#blocking_pending.set(effect2, blocking_pending_count + 1); | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| decrement(blocking, effect2) { | |
| this.#pending -= 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| if (blocking_pending_count === 1) { | |
| this.#blocking_pending.delete(effect2); | |
| } else { | |
| this.#blocking_pending.set(effect2, blocking_pending_count - 1); | |
| } | |
| } | |
| if (this.#decrement_queued) return; | |
| this.#decrement_queued = true; | |
| queue_micro_task(() => { | |
| this.#decrement_queued = false; | |
| if (this.linked) { | |
| this.flush(); | |
| } | |
| }); | |
| } | |
| /** | |
| * @param {Set<Effect>} dirty_effects | |
| * @param {Set<Effect>} maybe_dirty_effects | |
| */ | |
| transfer_effects(dirty_effects, maybe_dirty_effects) { | |
| for (const e of dirty_effects) { | |
| this.#dirty_effects.add(e); | |
| } | |
| for (const e of maybe_dirty_effects) { | |
| this.#maybe_dirty_effects.add(e); | |
| } | |
| dirty_effects.clear(); | |
| maybe_dirty_effects.clear(); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| oncommit(fn) { | |
| this.#commit_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| ondiscard(fn) { | |
| this.#discard_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| on_fork_commit(fn) { | |
| this.#fork_commit_callbacks.add(fn); | |
| } | |
| run_fork_commit_callbacks() { | |
| for (const fn of this.#fork_commit_callbacks) fn(this); | |
| this.#fork_commit_callbacks.clear(); | |
| } | |
| settled() { | |
| return (this.#deferred ??= deferred()).promise; | |
| } | |
| static ensure() { | |
| if (current_batch === null) { | |
| const batch = current_batch = new Batch(); | |
| batch.#link(); | |
| if (!is_processing && !is_flushing_sync) { | |
| queue_micro_task(() => { | |
| if (!batch.#started) { | |
| batch.flush(); | |
| } | |
| }); | |
| } | |
| } | |
| return current_batch; | |
| } | |
| apply() { | |
| { | |
| batch_values = null; | |
| return; | |
| } | |
| } | |
| /** | |
| * | |
| * @param {Effect} effect | |
| */ | |
| schedule(effect2) { | |
| last_scheduled_effect = effect2; | |
| if (effect2.b?.is_pending && (effect2.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 && (effect2.f & REACTION_RAN) === 0) { | |
| effect2.b.defer_effect(effect2); | |
| return; | |
| } | |
| var e = effect2; | |
| while (e.parent !== null) { | |
| e = e.parent; | |
| var flags2 = e.f; | |
| if (collected_effects !== null && e === active_effect) { | |
| if ((active_reaction === null || (active_reaction.f & DERIVED) === 0) && true) { | |
| return; | |
| } | |
| } | |
| if ((flags2 & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { | |
| if ((flags2 & CLEAN) === 0) { | |
| return; | |
| } | |
| e.f ^= CLEAN; | |
| } | |
| } | |
| this.#roots.push(e); | |
| } | |
| #link() { | |
| if (last_batch === null) { | |
| first_batch = last_batch = this; | |
| } else { | |
| last_batch.#next = this; | |
| this.#prev = last_batch; | |
| } | |
| last_batch = this; | |
| } | |
| #unlink() { | |
| var prev = this.#prev; | |
| var next2 = this.#next; | |
| if (prev === null) { | |
| first_batch = next2; | |
| } else { | |
| prev.#next = next2; | |
| } | |
| if (next2 === null) { | |
| last_batch = prev; | |
| } else { | |
| next2.#prev = prev; | |
| } | |
| this.linked = false; | |
| } | |
| } | |
| function flushSync(fn) { | |
| var was_flushing_sync = is_flushing_sync; | |
| is_flushing_sync = true; | |
| try { | |
| var result; | |
| if (fn) ; | |
| while (true) { | |
| flush_tasks(); | |
| if (current_batch === null) { | |
| return ( | |
| /** @type {T} */ | |
| result | |
| ); | |
| } | |
| current_batch.flush(); | |
| } | |
| } finally { | |
| is_flushing_sync = was_flushing_sync; | |
| } | |
| } | |
| function infinite_loop_guard() { | |
| try { | |
| effect_update_depth_exceeded(); | |
| } catch (error) { | |
| invoke_error_boundary(error, last_scheduled_effect); | |
| } | |
| } | |
| let eager_block_effects = null; | |
| function flush_queued_effects(effects) { | |
| var length = effects.length; | |
| if (length === 0) return; | |
| var i = 0; | |
| while (i < length) { | |
| var effect2 = effects[i++]; | |
| if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) { | |
| eager_block_effects = /* @__PURE__ */ new Set(); | |
| update_effect(effect2); | |
| if (effect2.deps === null && effect2.first === null && effect2.nodes === null && effect2.teardown === null && effect2.ac === null) { | |
| unlink_effect(effect2); | |
| } | |
| if (eager_block_effects?.size > 0) { | |
| old_values.clear(); | |
| for (const e of eager_block_effects) { | |
| if ((e.f & (DESTROYED | INERT)) !== 0) continue; | |
| const ordered_effects = [e]; | |
| let ancestor = e.parent; | |
| while (ancestor !== null) { | |
| if (eager_block_effects.has(ancestor)) { | |
| eager_block_effects.delete(ancestor); | |
| ordered_effects.push(ancestor); | |
| } | |
| ancestor = ancestor.parent; | |
| } | |
| for (let j = ordered_effects.length - 1; j >= 0; j--) { | |
| const e2 = ordered_effects[j]; | |
| if ((e2.f & (DESTROYED | INERT)) !== 0) continue; | |
| update_effect(e2); | |
| } | |
| } | |
| eager_block_effects.clear(); | |
| } | |
| } | |
| } | |
| eager_block_effects = null; | |
| } | |
| function mark_effects(value, sources, marked, checked) { | |
| if (marked.has(value)) return; | |
| marked.add(value); | |
| if (value.reactions !== null) { | |
| for (const reaction of value.reactions) { | |
| const flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark_effects( | |
| /** @type {Derived} */ | |
| reaction, | |
| sources, | |
| marked, | |
| checked | |
| ); | |
| } else if ((flags2 & (ASYNC | BLOCK_EFFECT)) !== 0 && (flags2 & DIRTY) === 0 && depends_on(reaction, sources, checked)) { | |
| set_signal_status(reaction, DIRTY); | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| function depends_on(reaction, sources, checked) { | |
| const depends = checked.get(reaction); | |
| if (depends !== void 0) return depends; | |
| if (reaction.deps !== null) { | |
| for (const dep of reaction.deps) { | |
| if (includes.call(sources, dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on( | |
| /** @type {Derived} */ | |
| dep, | |
| sources, | |
| checked | |
| )) { | |
| checked.set( | |
| /** @type {Derived} */ | |
| dep, | |
| true | |
| ); | |
| return true; | |
| } | |
| } | |
| } | |
| checked.set(reaction, false); | |
| return false; | |
| } | |
| function schedule_effect(effect2) { | |
| current_batch.schedule(effect2); | |
| } | |
| function reset_branch(effect2, tracked) { | |
| if ((effect2.f & BRANCH_EFFECT) !== 0 && (effect2.f & CLEAN) !== 0) { | |
| return; | |
| } | |
| if ((effect2.f & DIRTY) !== 0) { | |
| tracked.d.push(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| tracked.m.push(effect2); | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_branch(e, tracked); | |
| e = e.next; | |
| } | |
| } | |
| function reset_all(effect2) { | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_all(e); | |
| e = e.next; | |
| } | |
| } | |
| function createSubscriber(start) { | |
| let subscribers = 0; | |
| let version = source(0); | |
| let stop; | |
| return () => { | |
| if (effect_tracking()) { | |
| get(version); | |
| render_effect(() => { | |
| if (subscribers === 0) { | |
| stop = untrack(() => start(() => increment(version))); | |
| } | |
| subscribers += 1; | |
| return () => { | |
| queue_micro_task(() => { | |
| subscribers -= 1; | |
| if (subscribers === 0) { | |
| stop?.(); | |
| stop = void 0; | |
| increment(version); | |
| } | |
| }); | |
| }; | |
| }); | |
| } | |
| }; | |
| } | |
| var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED; | |
| function boundary(node, props, children, transform_error) { | |
| new Boundary(node, props, children, transform_error); | |
| } | |
| class Boundary { | |
| /** @type {Boundary | null} */ | |
| parent; | |
| is_pending = false; | |
| /** | |
| * API-level transformError transform function. Transforms errors before they reach the `failed` snippet. | |
| * Inherited from parent boundary, or defaults to identity. | |
| * @type {(error: unknown) => unknown} | |
| */ | |
| transform_error; | |
| /** @type {TemplateNode} */ | |
| #anchor; | |
| /** @type {TemplateNode | null} */ | |
| #hydrate_open = hydrating ? hydrate_node : null; | |
| /** @type {BoundaryProps} */ | |
| #props; | |
| /** @type {((anchor: Node) => void)} */ | |
| #children; | |
| /** @type {Effect} */ | |
| #effect; | |
| /** @type {Effect | null} */ | |
| #main_effect = null; | |
| /** @type {Effect | null} */ | |
| #pending_effect = null; | |
| /** @type {Effect | null} */ | |
| #failed_effect = null; | |
| /** @type {DocumentFragment | null} */ | |
| #offscreen_fragment = null; | |
| #local_pending_count = 0; | |
| #pending_count = 0; | |
| #pending_count_update_queued = false; | |
| /** @type {Set<Effect>} */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** @type {Set<Effect>} */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A source containing the number of pending async deriveds/expressions. | |
| * Only created if `$effect.pending()` is used inside the boundary, | |
| * otherwise updating the source results in needless `Batch.ensure()` | |
| * calls followed by no-op flushes | |
| * @type {Source<number> | null} | |
| */ | |
| #effect_pending = null; | |
| #effect_pending_subscriber = createSubscriber(() => { | |
| this.#effect_pending = source(this.#local_pending_count); | |
| return () => { | |
| this.#effect_pending = null; | |
| }; | |
| }); | |
| /** | |
| * @param {TemplateNode} node | |
| * @param {BoundaryProps} props | |
| * @param {((anchor: Node) => void)} children | |
| * @param {((error: unknown) => unknown) | undefined} [transform_error] | |
| */ | |
| constructor(node, props, children, transform_error) { | |
| this.#anchor = node; | |
| this.#props = props; | |
| this.#children = (anchor) => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| children(anchor); | |
| }; | |
| this.parent = /** @type {Effect} */ | |
| active_effect.b; | |
| this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e); | |
| this.#effect = block(() => { | |
| if (hydrating) { | |
| const comment2 = ( | |
| /** @type {Comment} */ | |
| this.#hydrate_open | |
| ); | |
| hydrate_next(); | |
| const server_rendered_pending = comment2.data === HYDRATION_START_ELSE; | |
| const server_rendered_failed = comment2.data.startsWith(HYDRATION_START_FAILED); | |
| if (server_rendered_failed) { | |
| const serialized_error = JSON.parse(comment2.data.slice(HYDRATION_START_FAILED.length)); | |
| this.#hydrate_failed_content(serialized_error); | |
| } else if (server_rendered_pending) { | |
| this.#hydrate_pending_content(); | |
| } else { | |
| this.#hydrate_resolved_content(); | |
| } | |
| } else { | |
| this.#render(); | |
| } | |
| }, flags); | |
| if (hydrating) { | |
| this.#anchor = hydrate_node; | |
| } | |
| } | |
| #hydrate_resolved_content() { | |
| try { | |
| this.#main_effect = branch(() => this.#children(this.#anchor)); | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error The deserialized error from the server's hydration comment | |
| */ | |
| #hydrate_failed_content(error) { | |
| const failed = this.#props.failed; | |
| if (!failed) return; | |
| this.#failed_effect = branch(() => { | |
| failed( | |
| this.#anchor, | |
| () => error, | |
| () => () => { | |
| } | |
| ); | |
| }); | |
| } | |
| #hydrate_pending_content() { | |
| const pending = this.#props.pending; | |
| if (!pending) return; | |
| this.is_pending = true; | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| queue_micro_task(() => { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| var anchor = create_text(); | |
| fragment.append(anchor); | |
| this.#main_effect = this.#run(() => { | |
| return branch(() => this.#children(anchor)); | |
| }); | |
| if (this.#pending_count === 0) { | |
| this.#anchor.before(fragment); | |
| this.#offscreen_fragment = null; | |
| pause_effect( | |
| /** @type {Effect} */ | |
| this.#pending_effect, | |
| () => { | |
| this.#pending_effect = null; | |
| } | |
| ); | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| }); | |
| } | |
| #render() { | |
| try { | |
| this.is_pending = this.has_pending_snippet(); | |
| this.#pending_count = 0; | |
| this.#local_pending_count = 0; | |
| this.#main_effect = branch(() => { | |
| this.#children(this.#anchor); | |
| }); | |
| if (this.#pending_count > 0) { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| move_effect(this.#main_effect, fragment); | |
| const pending = ( | |
| /** @type {(anchor: Node) => void} */ | |
| this.#props.pending | |
| ); | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| } else { | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #resolve(batch) { | |
| this.is_pending = false; | |
| batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Defer an effect inside a pending boundary until the boundary resolves | |
| * @param {Effect} effect | |
| */ | |
| defer_effect(effect2) { | |
| defer_effect(effect2, this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Returns `false` if the effect exists inside a boundary whose pending snippet is shown | |
| * @returns {boolean} | |
| */ | |
| is_rendered() { | |
| return !this.is_pending && (!this.parent || this.parent.is_rendered()); | |
| } | |
| has_pending_snippet() { | |
| return !!this.#props.pending; | |
| } | |
| /** | |
| * @template T | |
| * @param {() => T} fn | |
| */ | |
| #run(fn) { | |
| var previous_effect = active_effect; | |
| var previous_reaction = active_reaction; | |
| var previous_ctx = component_context; | |
| set_active_effect(this.#effect); | |
| set_active_reaction(this.#effect); | |
| set_component_context(this.#effect.ctx); | |
| try { | |
| Batch.ensure(); | |
| return fn(); | |
| } catch (e) { | |
| handle_error(e); | |
| return null; | |
| } finally { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_ctx); | |
| } | |
| } | |
| /** | |
| * Updates the pending count associated with the currently visible pending snippet, | |
| * if any, such that we can replace the snippet with content once work is done | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| #update_pending_count(d, batch) { | |
| if (!this.has_pending_snippet()) { | |
| if (this.parent) { | |
| this.parent.#update_pending_count(d, batch); | |
| } | |
| return; | |
| } | |
| this.#pending_count += d; | |
| if (this.#pending_count === 0) { | |
| this.#resolve(batch); | |
| if (this.#pending_effect) { | |
| pause_effect(this.#pending_effect, () => { | |
| this.#pending_effect = null; | |
| }); | |
| } | |
| if (this.#offscreen_fragment) { | |
| this.#anchor.before(this.#offscreen_fragment); | |
| this.#offscreen_fragment = null; | |
| } | |
| } | |
| } | |
| /** | |
| * Update the source that powers `$effect.pending()` inside this boundary, | |
| * and controls when the current `pending` snippet (if any) is removed. | |
| * Do not call from inside the class | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| update_pending_count(d, batch) { | |
| this.#update_pending_count(d, batch); | |
| this.#local_pending_count += d; | |
| if (!this.#effect_pending || this.#pending_count_update_queued) return; | |
| this.#pending_count_update_queued = true; | |
| queue_micro_task(() => { | |
| this.#pending_count_update_queued = false; | |
| if (this.#effect_pending) { | |
| internal_set(this.#effect_pending, this.#local_pending_count); | |
| } | |
| }); | |
| } | |
| get_effect_pending() { | |
| this.#effect_pending_subscriber(); | |
| return get( | |
| /** @type {Source<number>} */ | |
| this.#effect_pending | |
| ); | |
| } | |
| /** @param {unknown} error */ | |
| error(error) { | |
| if (!this.#props.onerror && !this.#props.failed) { | |
| throw error; | |
| } | |
| if (current_batch?.is_fork) { | |
| if (this.#main_effect) current_batch.skip_effect(this.#main_effect); | |
| if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect); | |
| if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect); | |
| current_batch.on_fork_commit(() => { | |
| this.#handle_error(error); | |
| }); | |
| } else { | |
| this.#handle_error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error | |
| */ | |
| #handle_error(error) { | |
| if (this.#main_effect) { | |
| destroy_effect(this.#main_effect); | |
| this.#main_effect = null; | |
| } | |
| if (this.#pending_effect) { | |
| destroy_effect(this.#pending_effect); | |
| this.#pending_effect = null; | |
| } | |
| if (this.#failed_effect) { | |
| destroy_effect(this.#failed_effect); | |
| this.#failed_effect = null; | |
| } | |
| if (hydrating) { | |
| set_hydrate_node( | |
| /** @type {TemplateNode} */ | |
| this.#hydrate_open | |
| ); | |
| next(); | |
| set_hydrate_node(skip_nodes()); | |
| } | |
| var onerror = this.#props.onerror; | |
| let failed = this.#props.failed; | |
| var did_reset = false; | |
| var calling_on_error = false; | |
| const reset2 = () => { | |
| if (did_reset) { | |
| svelte_boundary_reset_noop(); | |
| return; | |
| } | |
| did_reset = true; | |
| if (calling_on_error) { | |
| svelte_boundary_reset_onerror(); | |
| } | |
| if (this.#failed_effect !== null) { | |
| pause_effect(this.#failed_effect, () => { | |
| this.#failed_effect = null; | |
| }); | |
| } | |
| this.#run(() => { | |
| this.#render(); | |
| }); | |
| }; | |
| const handle_error_result = (transformed_error) => { | |
| try { | |
| calling_on_error = true; | |
| onerror?.(transformed_error, reset2); | |
| calling_on_error = false; | |
| } catch (error2) { | |
| invoke_error_boundary(error2, this.#effect && this.#effect.parent); | |
| } | |
| if (failed) { | |
| this.#failed_effect = this.#run(() => { | |
| try { | |
| return branch(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| failed( | |
| this.#anchor, | |
| () => transformed_error, | |
| () => reset2 | |
| ); | |
| }); | |
| } catch (error2) { | |
| invoke_error_boundary( | |
| error2, | |
| /** @type {Effect} */ | |
| this.#effect.parent | |
| ); | |
| return null; | |
| } | |
| }); | |
| } | |
| }; | |
| queue_micro_task(() => { | |
| var result; | |
| try { | |
| result = this.transform_error(error); | |
| } catch (e) { | |
| invoke_error_boundary(e, this.#effect && this.#effect.parent); | |
| return; | |
| } | |
| if (result !== null && typeof result === "object" && typeof /** @type {any} */ | |
| result.then === "function") { | |
| result.then( | |
| handle_error_result, | |
| /** @param {unknown} e */ | |
| (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent) | |
| ); | |
| } else { | |
| handle_error_result(result); | |
| } | |
| }); | |
| } | |
| } | |
| function flatten(blockers, sync, async, fn) { | |
| const d = derived; | |
| var pending = blockers.filter((b) => !b.settled); | |
| if (async.length === 0 && pending.length === 0) { | |
| fn(sync.map(d)); | |
| return; | |
| } | |
| var parent = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var restore = capture(); | |
| var blocker_promise = pending.length === 1 ? pending[0].promise : pending.length > 1 ? Promise.all(pending.map((b) => b.promise)) : null; | |
| function finish(values) { | |
| if ((parent.f & DESTROYED) !== 0) { | |
| return; | |
| } | |
| restore(); | |
| try { | |
| fn(values); | |
| } catch (error) { | |
| invoke_error_boundary(error, parent); | |
| } | |
| unset_context(); | |
| } | |
| var decrement_pending = increment_pending(); | |
| if (async.length === 0) { | |
| blocker_promise.then(() => finish(sync.map(d))).finally(decrement_pending); | |
| return; | |
| } | |
| function run() { | |
| Promise.all(async.map((expression) => /* @__PURE__ */ async_derived(expression))).then((result) => finish([...sync.map(d), ...result])).catch((error) => invoke_error_boundary(error, parent)).finally(decrement_pending); | |
| } | |
| if (blocker_promise) { | |
| blocker_promise.then(() => { | |
| restore(); | |
| run(); | |
| unset_context(); | |
| }); | |
| } else { | |
| run(); | |
| } | |
| } | |
| function capture() { | |
| var previous_effect = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var previous_reaction = active_reaction; | |
| var previous_component_context = component_context; | |
| var previous_batch2 = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| return function restore(activate_batch = true) { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_component_context); | |
| if (activate_batch && (previous_effect.f & DESTROYED) === 0) { | |
| previous_batch2?.activate(); | |
| previous_batch2?.apply(); | |
| } | |
| }; | |
| } | |
| function unset_context(deactivate_batch = true) { | |
| set_active_effect(null); | |
| set_active_reaction(null); | |
| set_component_context(null); | |
| if (deactivate_batch) current_batch?.deactivate(); | |
| } | |
| function increment_pending() { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var boundary2 = ( | |
| /** @type {Boundary} */ | |
| effect2.b | |
| ); | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| var blocking = boundary2.is_rendered(); | |
| boundary2.update_pending_count(1, batch); | |
| batch.increment(blocking, effect2); | |
| return () => { | |
| boundary2.update_pending_count(-1, batch); | |
| batch.decrement(blocking, effect2); | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function derived(fn) { | |
| var flags2 = DERIVED | DIRTY; | |
| if (active_effect !== null) { | |
| active_effect.f |= EFFECT_PRESERVED; | |
| } | |
| const signal = { | |
| ctx: component_context, | |
| deps: null, | |
| effects: null, | |
| equals, | |
| f: flags2, | |
| fn, | |
| reactions: null, | |
| rv: 0, | |
| v: ( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ), | |
| wv: 0, | |
| parent: active_effect, | |
| ac: null | |
| }; | |
| return signal; | |
| } | |
| const OBSOLETE = /* @__PURE__ */ Symbol("obsolete"); | |
| // @__NO_SIDE_EFFECTS__ | |
| function async_derived(fn, label, location2) { | |
| let parent = ( | |
| /** @type {Effect | null} */ | |
| active_effect | |
| ); | |
| if (parent === null) { | |
| async_derived_orphan(); | |
| } | |
| var promise = ( | |
| /** @type {Promise<V>} */ | |
| /** @type {unknown} */ | |
| void 0 | |
| ); | |
| var signal = source( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ); | |
| var should_suspend = !active_reaction; | |
| var deferreds = /* @__PURE__ */ new Set(); | |
| async_effect(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var d = deferred(); | |
| promise = d.promise; | |
| try { | |
| Promise.resolve(fn()).then(d.resolve, (e) => { | |
| if (e !== STALE_REACTION) d.reject(e); | |
| }).finally(unset_context); | |
| } catch (error) { | |
| d.reject(error); | |
| unset_context(); | |
| } | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| if (should_suspend) { | |
| if ((effect2.f & REACTION_RAN) !== 0) { | |
| var decrement_pending = increment_pending(); | |
| } | |
| if ( | |
| /** @type {Boundary} */ | |
| parent.b.is_rendered() | |
| ) { | |
| batch.async_deriveds.get(effect2)?.reject(OBSOLETE); | |
| } else { | |
| for (const d2 of deferreds.values()) { | |
| d2.reject(OBSOLETE); | |
| } | |
| } | |
| deferreds.add(d); | |
| batch.async_deriveds.set(effect2, d); | |
| } | |
| const handler = (value, error = void 0) => { | |
| decrement_pending?.(); | |
| deferreds.delete(d); | |
| if (error === OBSOLETE) return; | |
| batch.activate(); | |
| if (error) { | |
| signal.f |= ERROR_VALUE; | |
| internal_set(signal, error); | |
| } else { | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| signal.f ^= ERROR_VALUE; | |
| } | |
| internal_set(signal, value); | |
| } | |
| batch.deactivate(); | |
| }; | |
| d.promise.then(handler, (e) => handler(null, e || "unknown")); | |
| }); | |
| teardown(() => { | |
| for (const d of deferreds) { | |
| d.reject(OBSOLETE); | |
| } | |
| }); | |
| return new Promise((fulfil) => { | |
| function next2(p) { | |
| function go() { | |
| if (p === promise) { | |
| fulfil(signal); | |
| } else { | |
| next2(promise); | |
| } | |
| } | |
| p.then(go, go); | |
| } | |
| next2(promise); | |
| }); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function user_derived(fn) { | |
| const d = /* @__PURE__ */ derived(fn); | |
| push_reaction_value(d); | |
| return d; | |
| } | |
| function destroy_derived_effects(derived2) { | |
| var effects = derived2.effects; | |
| if (effects !== null) { | |
| derived2.effects = null; | |
| for (var i = 0; i < effects.length; i += 1) { | |
| destroy_effect( | |
| /** @type {Effect} */ | |
| effects[i] | |
| ); | |
| } | |
| } | |
| } | |
| function execute_derived(derived2) { | |
| var value; | |
| var prev_active_effect = active_effect; | |
| var parent = derived2.parent; | |
| if (!is_destroying_effect && parent !== null && derived2.v !== UNINITIALIZED && // if it was never evaluated before, it's guaranteed to fail downstream, so we try to execute instead | |
| (parent.f & (DESTROYED | INERT)) !== 0) { | |
| derived_inert(); | |
| return derived2.v; | |
| } | |
| set_active_effect(parent); | |
| { | |
| try { | |
| derived2.f &= ~WAS_MARKED; | |
| destroy_derived_effects(derived2); | |
| value = update_reaction(derived2); | |
| } finally { | |
| set_active_effect(prev_active_effect); | |
| } | |
| } | |
| return value; | |
| } | |
| function update_derived(derived2) { | |
| var value = execute_derived(derived2); | |
| if (!derived2.equals(value)) { | |
| derived2.wv = increment_write_version(); | |
| if (!current_batch?.is_fork || derived2.deps === null) { | |
| if (current_batch !== null) { | |
| current_batch.capture(derived2, value, true); | |
| previous_batch?.capture(derived2, value, true); | |
| } else { | |
| derived2.v = value; | |
| } | |
| if (derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| return; | |
| } | |
| } | |
| } | |
| if (is_destroying_effect) { | |
| return; | |
| } | |
| if (batch_values !== null) { | |
| if (effect_tracking() || current_batch?.is_fork) { | |
| batch_values.set(derived2, value); | |
| } | |
| } else { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| function freeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown || e.ac) { | |
| e.teardown?.(); | |
| e.ac?.abort(STALE_REACTION); | |
| if (e.fn !== null) e.teardown = noop; | |
| e.ac = null; | |
| remove_reactions(e, 0); | |
| destroy_effect_children(e); | |
| } | |
| } | |
| } | |
| function unfreeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown && e.fn !== null) { | |
| update_effect(e); | |
| } | |
| } | |
| } | |
| let eager_effects = /* @__PURE__ */ new Set(); | |
| const old_values = /* @__PURE__ */ new Map(); | |
| let eager_effects_deferred = false; | |
| function source(v, stack) { | |
| var signal = { | |
| f: 0, | |
| // TODO ideally we could skip this altogether, but it causes type errors | |
| v, | |
| reactions: null, | |
| equals, | |
| rv: 0, | |
| wv: 0 | |
| }; | |
| return signal; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function state(v, stack) { | |
| const s = source(v); | |
| push_reaction_value(s); | |
| return s; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function mutable_source(initial_value, immutable = false, trackable = true) { | |
| const s = source(initial_value); | |
| if (!immutable) { | |
| s.equals = safe_equals; | |
| } | |
| return s; | |
| } | |
| function set(source2, value, should_proxy = false) { | |
| if (active_reaction !== null && // since we are untracking the function inside `$inspect.with` we need to add this check | |
| // to ensure we error if state is set inside an inspect effect | |
| (!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 && (current_sources === null || !includes.call(current_sources, source2))) { | |
| state_unsafe_mutation(); | |
| } | |
| let new_value = should_proxy ? proxy(value) : value; | |
| return internal_set(source2, new_value, legacy_updates); | |
| } | |
| function internal_set(source2, value, updated_during_traversal = null) { | |
| if (!source2.equals(value)) { | |
| old_values.set(source2, is_destroying_effect ? value : source2.v); | |
| var batch = Batch.ensure(); | |
| batch.capture(source2, value); | |
| if ((source2.f & DERIVED) !== 0) { | |
| const derived2 = ( | |
| /** @type {Derived} */ | |
| source2 | |
| ); | |
| if ((source2.f & DIRTY) !== 0) { | |
| execute_derived(derived2); | |
| } | |
| if (batch_values === null) { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| source2.wv = increment_write_version(); | |
| mark_reactions(source2, DIRTY, updated_during_traversal); | |
| if (active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { | |
| if (untracked_writes === null) { | |
| set_untracked_writes([source2]); | |
| } else { | |
| untracked_writes.push(source2); | |
| } | |
| } | |
| if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) { | |
| flush_eager_effects(); | |
| } | |
| } | |
| return value; | |
| } | |
| function flush_eager_effects() { | |
| eager_effects_deferred = false; | |
| for (const effect2 of eager_effects) { | |
| if ((effect2.f & CLEAN) !== 0) { | |
| set_signal_status(effect2, MAYBE_DIRTY); | |
| } | |
| let dirty; | |
| try { | |
| dirty = is_dirty(effect2); | |
| } catch { | |
| dirty = true; | |
| } | |
| if (dirty) { | |
| update_effect(effect2); | |
| } | |
| } | |
| eager_effects.clear(); | |
| } | |
| function increment(source2) { | |
| set(source2, source2.v + 1); | |
| } | |
| function mark_reactions(signal, status, updated_during_traversal) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| var length = reactions.length; | |
| for (var i = 0; i < length; i++) { | |
| var reaction = reactions[i]; | |
| var flags2 = reaction.f; | |
| var not_dirty = (flags2 & DIRTY) === 0; | |
| if (not_dirty) { | |
| set_signal_status(reaction, status); | |
| } | |
| if ((flags2 & EAGER_EFFECT) !== 0) { | |
| eager_effects.add( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } else if ((flags2 & DERIVED) !== 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| batch_values?.delete(derived2); | |
| if ((flags2 & WAS_MARKED) === 0) { | |
| if (flags2 & CONNECTED && (active_effect === null || (active_effect.f & REACTION_IS_UPDATING) === 0)) { | |
| reaction.f |= WAS_MARKED; | |
| } | |
| mark_reactions(derived2, MAYBE_DIRTY, updated_during_traversal); | |
| } | |
| } else if (not_dirty) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if ((flags2 & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) { | |
| eager_block_effects.add(effect2); | |
| } | |
| if (updated_during_traversal !== null) { | |
| updated_during_traversal.push(effect2); | |
| } else { | |
| schedule_effect(effect2); | |
| } | |
| } | |
| } | |
| } | |
| function autofocus(dom, value) { | |
| if (value) { | |
| const body = document.body; | |
| dom.autofocus = true; | |
| queue_micro_task(() => { | |
| if (document.activeElement === body) { | |
| dom.focus(); | |
| } | |
| }); | |
| } | |
| } | |
| let listening_to_form_reset = false; | |
| function add_form_reset_listener() { | |
| if (!listening_to_form_reset) { | |
| listening_to_form_reset = true; | |
| document.addEventListener( | |
| "reset", | |
| (evt) => { | |
| Promise.resolve().then(() => { | |
| if (!evt.defaultPrevented) { | |
| for ( | |
| const e of | |
| /**@type {HTMLFormElement} */ | |
| evt.target.elements | |
| ) { | |
| e[FORM_RESET_HANDLER]?.(); | |
| } | |
| } | |
| }); | |
| }, | |
| // In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation) | |
| { capture: true } | |
| ); | |
| } | |
| } | |
| function without_reactive_context(fn) { | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| return fn(); | |
| } finally { | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| function listen_to_event_and_reset_event(element, event2, handler, on_reset = handler) { | |
| element.addEventListener(event2, () => without_reactive_context(handler)); | |
| const prev = ( | |
| /** @type {any} */ | |
| element[FORM_RESET_HANDLER] | |
| ); | |
| if (prev) { | |
| element[FORM_RESET_HANDLER] = () => { | |
| prev(); | |
| on_reset(true); | |
| }; | |
| } else { | |
| element[FORM_RESET_HANDLER] = () => on_reset(true); | |
| } | |
| add_form_reset_listener(); | |
| } | |
| let is_updating_effect = false; | |
| let is_destroying_effect = false; | |
| function set_is_destroying_effect(value) { | |
| is_destroying_effect = value; | |
| } | |
| let active_reaction = null; | |
| let untracking = false; | |
| function set_active_reaction(reaction) { | |
| active_reaction = reaction; | |
| } | |
| let active_effect = null; | |
| function set_active_effect(effect2) { | |
| active_effect = effect2; | |
| } | |
| let current_sources = null; | |
| function push_reaction_value(value) { | |
| if (active_reaction !== null && true) { | |
| if (current_sources === null) { | |
| current_sources = [value]; | |
| } else { | |
| current_sources.push(value); | |
| } | |
| } | |
| } | |
| let new_deps = null; | |
| let skipped_deps = 0; | |
| let untracked_writes = null; | |
| function set_untracked_writes(value) { | |
| untracked_writes = value; | |
| } | |
| let write_version = 1; | |
| let read_version = 0; | |
| let update_version = read_version; | |
| function set_update_version(value) { | |
| update_version = value; | |
| } | |
| function increment_write_version() { | |
| return ++write_version; | |
| } | |
| function is_dirty(reaction) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DIRTY) !== 0) { | |
| return true; | |
| } | |
| if (flags2 & DERIVED) { | |
| reaction.f &= ~WAS_MARKED; | |
| } | |
| if ((flags2 & MAYBE_DIRTY) !== 0) { | |
| var dependencies = ( | |
| /** @type {Value[]} */ | |
| reaction.deps | |
| ); | |
| var length = dependencies.length; | |
| for (var i = 0; i < length; i++) { | |
| var dependency = dependencies[i]; | |
| if (is_dirty( | |
| /** @type {Derived} */ | |
| dependency | |
| )) { | |
| update_derived( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| } | |
| if (dependency.wv > reaction.wv) { | |
| return true; | |
| } | |
| } | |
| if ((flags2 & CONNECTED) !== 0 && // During time traveling we don't want to reset the status so that | |
| // traversal of the graph in the other batches still happens | |
| batch_values === null) { | |
| set_signal_status(reaction, CLEAN); | |
| } | |
| } | |
| return false; | |
| } | |
| function schedule_possible_effect_self_invalidation(signal, effect2, root2 = true) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| if (current_sources !== null && includes.call(current_sources, signal)) { | |
| return; | |
| } | |
| for (var i = 0; i < reactions.length; i++) { | |
| var reaction = reactions[i]; | |
| if ((reaction.f & DERIVED) !== 0) { | |
| schedule_possible_effect_self_invalidation( | |
| /** @type {Derived} */ | |
| reaction, | |
| effect2, | |
| false | |
| ); | |
| } else if (effect2 === reaction) { | |
| if (root2) { | |
| set_signal_status(reaction, DIRTY); | |
| } else if ((reaction.f & CLEAN) !== 0) { | |
| set_signal_status(reaction, MAYBE_DIRTY); | |
| } | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| function update_reaction(reaction) { | |
| var previous_deps = new_deps; | |
| var previous_skipped_deps = skipped_deps; | |
| var previous_untracked_writes = untracked_writes; | |
| var previous_reaction = active_reaction; | |
| var previous_sources = current_sources; | |
| var previous_component_context = component_context; | |
| var previous_untracking = untracking; | |
| var previous_update_version = update_version; | |
| var flags2 = reaction.f; | |
| new_deps = /** @type {null | Value[]} */ | |
| null; | |
| skipped_deps = 0; | |
| untracked_writes = null; | |
| active_reaction = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; | |
| current_sources = null; | |
| set_component_context(reaction.ctx); | |
| untracking = false; | |
| update_version = ++read_version; | |
| if (reaction.ac !== null) { | |
| without_reactive_context(() => { | |
| reaction.ac.abort(STALE_REACTION); | |
| }); | |
| reaction.ac = null; | |
| } | |
| try { | |
| reaction.f |= REACTION_IS_UPDATING; | |
| var fn = ( | |
| /** @type {Function} */ | |
| reaction.fn | |
| ); | |
| var result = fn(); | |
| reaction.f |= REACTION_RAN; | |
| var deps = reaction.deps; | |
| var is_fork = current_batch?.is_fork; | |
| if (new_deps !== null) { | |
| var i; | |
| if (!is_fork) { | |
| remove_reactions(reaction, skipped_deps); | |
| } | |
| if (deps !== null && skipped_deps > 0) { | |
| deps.length = skipped_deps + new_deps.length; | |
| for (i = 0; i < new_deps.length; i++) { | |
| deps[skipped_deps + i] = new_deps[i]; | |
| } | |
| } else { | |
| reaction.deps = deps = new_deps; | |
| } | |
| if (effect_tracking() && (reaction.f & CONNECTED) !== 0) { | |
| for (i = skipped_deps; i < deps.length; i++) { | |
| (deps[i].reactions ??= []).push(reaction); | |
| } | |
| } | |
| } else if (!is_fork && deps !== null && skipped_deps < deps.length) { | |
| remove_reactions(reaction, skipped_deps); | |
| deps.length = skipped_deps; | |
| } | |
| if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0) { | |
| for (i = 0; i < /** @type {Source[]} */ | |
| untracked_writes.length; i++) { | |
| schedule_possible_effect_self_invalidation( | |
| untracked_writes[i], | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| if (previous_reaction !== null && previous_reaction !== reaction) { | |
| read_version++; | |
| if (previous_reaction.deps !== null) { | |
| for (let i2 = 0; i2 < previous_skipped_deps; i2 += 1) { | |
| previous_reaction.deps[i2].rv = read_version; | |
| } | |
| } | |
| if (previous_deps !== null) { | |
| for (const dep of previous_deps) { | |
| dep.rv = read_version; | |
| } | |
| } | |
| if (untracked_writes !== null) { | |
| if (previous_untracked_writes === null) { | |
| previous_untracked_writes = untracked_writes; | |
| } else { | |
| previous_untracked_writes.push(.../** @type {Source[]} */ | |
| untracked_writes); | |
| } | |
| } | |
| } | |
| if ((reaction.f & ERROR_VALUE) !== 0) { | |
| reaction.f ^= ERROR_VALUE; | |
| } | |
| return result; | |
| } catch (error) { | |
| return handle_error(error); | |
| } finally { | |
| reaction.f ^= REACTION_IS_UPDATING; | |
| new_deps = previous_deps; | |
| skipped_deps = previous_skipped_deps; | |
| untracked_writes = previous_untracked_writes; | |
| active_reaction = previous_reaction; | |
| current_sources = previous_sources; | |
| set_component_context(previous_component_context); | |
| untracking = previous_untracking; | |
| update_version = previous_update_version; | |
| } | |
| } | |
| function remove_reaction(signal, dependency) { | |
| let reactions = dependency.reactions; | |
| if (reactions !== null) { | |
| var index = index_of.call(reactions, signal); | |
| if (index !== -1) { | |
| var new_length = reactions.length - 1; | |
| if (new_length === 0) { | |
| reactions = dependency.reactions = null; | |
| } else { | |
| reactions[index] = reactions[new_length]; | |
| reactions.pop(); | |
| } | |
| } | |
| } | |
| if (reactions === null && (dependency.f & DERIVED) !== 0 && // Destroying a child effect while updating a parent effect can cause a dependency to appear | |
| // to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps` | |
| // allows us to skip the expensive work of disconnecting and immediately reconnecting it | |
| (new_deps === null || !includes.call(new_deps, dependency))) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| if ((derived2.f & CONNECTED) !== 0) { | |
| derived2.f ^= CONNECTED; | |
| derived2.f &= ~WAS_MARKED; | |
| } | |
| if (derived2.v !== UNINITIALIZED) { | |
| update_derived_status(derived2); | |
| } | |
| freeze_derived_effects(derived2); | |
| remove_reactions(derived2, 0); | |
| } | |
| } | |
| function remove_reactions(signal, start_index) { | |
| var dependencies = signal.deps; | |
| if (dependencies === null) return; | |
| for (var i = start_index; i < dependencies.length; i++) { | |
| remove_reaction(signal, dependencies[i]); | |
| } | |
| } | |
| function update_effect(effect2) { | |
| var flags2 = effect2.f; | |
| if ((flags2 & DESTROYED) !== 0) { | |
| return; | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var previous_effect = active_effect; | |
| var was_updating_effect = is_updating_effect; | |
| active_effect = effect2; | |
| is_updating_effect = true; | |
| try { | |
| if ((flags2 & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) { | |
| destroy_block_effect_children(effect2); | |
| } else { | |
| destroy_effect_children(effect2); | |
| } | |
| execute_effect_teardown(effect2); | |
| var teardown2 = update_reaction(effect2); | |
| effect2.teardown = typeof teardown2 === "function" ? teardown2 : null; | |
| effect2.wv = write_version; | |
| var dep; | |
| if (DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) ; | |
| } finally { | |
| is_updating_effect = was_updating_effect; | |
| active_effect = previous_effect; | |
| } | |
| } | |
| async function tick() { | |
| await Promise.resolve(); | |
| flushSync(); | |
| } | |
| function get(signal) { | |
| var flags2 = signal.f; | |
| var is_derived = (flags2 & DERIVED) !== 0; | |
| if (active_reaction !== null && !untracking) { | |
| var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0; | |
| if (!destroyed && (current_sources === null || !includes.call(current_sources, signal))) { | |
| var deps = active_reaction.deps; | |
| if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { | |
| if (signal.rv < read_version) { | |
| signal.rv = read_version; | |
| if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { | |
| skipped_deps++; | |
| } else if (new_deps === null) { | |
| new_deps = [signal]; | |
| } else { | |
| new_deps.push(signal); | |
| } | |
| } | |
| } else { | |
| (active_reaction.deps ??= []).push(signal); | |
| var reactions = signal.reactions; | |
| if (reactions === null) { | |
| signal.reactions = [active_reaction]; | |
| } else if (!includes.call(reactions, active_reaction)) { | |
| reactions.push(active_reaction); | |
| } | |
| } | |
| } | |
| } | |
| if (is_destroying_effect && old_values.has(signal)) { | |
| return old_values.get(signal); | |
| } | |
| if (is_derived) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| signal | |
| ); | |
| if (is_destroying_effect) { | |
| var value = derived2.v; | |
| if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) { | |
| value = execute_derived(derived2); | |
| } | |
| old_values.set(derived2, value); | |
| return value; | |
| } | |
| var should_connect = (derived2.f & CONNECTED) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & CONNECTED) !== 0); | |
| var is_new = (derived2.f & REACTION_RAN) === 0; | |
| if (is_dirty(derived2)) { | |
| if (should_connect) { | |
| derived2.f |= CONNECTED; | |
| } | |
| update_derived(derived2); | |
| } | |
| if (should_connect && !is_new) { | |
| unfreeze_derived_effects(derived2); | |
| reconnect(derived2); | |
| } | |
| } | |
| if (batch_values?.has(signal)) { | |
| return batch_values.get(signal); | |
| } | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| throw signal.v; | |
| } | |
| return signal.v; | |
| } | |
| function reconnect(derived2) { | |
| derived2.f |= CONNECTED; | |
| if (derived2.deps === null) return; | |
| for (const dep of derived2.deps) { | |
| (dep.reactions ??= []).push(derived2); | |
| if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) { | |
| unfreeze_derived_effects( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| reconnect( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| } | |
| } | |
| } | |
| function depends_on_old_values(derived2) { | |
| if (derived2.v === UNINITIALIZED) return true; | |
| if (derived2.deps === null) return false; | |
| for (const dep of derived2.deps) { | |
| if (old_values.has(dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on_old_values( | |
| /** @type {Derived} */ | |
| dep | |
| )) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function validate_effect(rune) { | |
| if (active_effect === null) { | |
| if (active_reaction === null) { | |
| effect_orphan(); | |
| } | |
| effect_in_unowned_derived(); | |
| } | |
| if (is_destroying_effect) { | |
| effect_in_teardown(); | |
| } | |
| } | |
| function push_effect(effect2, parent_effect) { | |
| var parent_last = parent_effect.last; | |
| if (parent_last === null) { | |
| parent_effect.last = parent_effect.first = effect2; | |
| } else { | |
| parent_last.next = effect2; | |
| effect2.prev = parent_last; | |
| parent_effect.last = effect2; | |
| } | |
| } | |
| function create_effect(type, fn) { | |
| var parent = active_effect; | |
| if (parent !== null && (parent.f & INERT) !== 0) { | |
| type |= INERT; | |
| } | |
| var effect2 = { | |
| ctx: component_context, | |
| deps: null, | |
| nodes: null, | |
| f: type | DIRTY | CONNECTED, | |
| first: null, | |
| fn, | |
| last: null, | |
| next: null, | |
| parent, | |
| b: parent && parent.b, | |
| prev: null, | |
| teardown: null, | |
| wv: 0, | |
| ac: null | |
| }; | |
| current_batch?.register_created_effect(effect2); | |
| var e = effect2; | |
| if ((type & EFFECT) !== 0) { | |
| if (collected_effects !== null) { | |
| collected_effects.push(effect2); | |
| } else { | |
| Batch.ensure().schedule(effect2); | |
| } | |
| } else if (fn !== null) { | |
| try { | |
| update_effect(effect2); | |
| } catch (e2) { | |
| destroy_effect(effect2); | |
| throw e2; | |
| } | |
| if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && // either `null`, or a singular child | |
| (e.f & EFFECT_PRESERVED) === 0) { | |
| e = e.first; | |
| if ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) { | |
| e.f |= EFFECT_TRANSPARENT; | |
| } | |
| } | |
| } | |
| if (e !== null) { | |
| e.parent = parent; | |
| if (parent !== null) { | |
| push_effect(e, parent); | |
| } | |
| if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| active_reaction | |
| ); | |
| (derived2.effects ??= []).push(e); | |
| } | |
| } | |
| return effect2; | |
| } | |
| function effect_tracking() { | |
| return active_reaction !== null && !untracking; | |
| } | |
| function teardown(fn) { | |
| const effect2 = create_effect(RENDER_EFFECT, null); | |
| set_signal_status(effect2, CLEAN); | |
| effect2.teardown = fn; | |
| return effect2; | |
| } | |
| function user_effect(fn) { | |
| validate_effect(); | |
| var flags2 = ( | |
| /** @type {Effect} */ | |
| active_effect.f | |
| ); | |
| var defer = !active_reaction && (flags2 & BRANCH_EFFECT) !== 0 && (flags2 & REACTION_RAN) === 0; | |
| if (defer) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| (context.e ??= []).push(fn); | |
| } else { | |
| return create_user_effect(fn); | |
| } | |
| } | |
| function create_user_effect(fn) { | |
| return create_effect(EFFECT | USER_EFFECT, fn); | |
| } | |
| function effect_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return () => { | |
| destroy_effect(effect2); | |
| }; | |
| } | |
| function component_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return (options = {}) => { | |
| return new Promise((fulfil) => { | |
| if (options.outro) { | |
| pause_effect(effect2, () => { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| }); | |
| } else { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| } | |
| }); | |
| }; | |
| } | |
| function effect(fn) { | |
| return create_effect(EFFECT, fn); | |
| } | |
| function async_effect(fn) { | |
| return create_effect(ASYNC | EFFECT_PRESERVED, fn); | |
| } | |
| function render_effect(fn, flags2 = 0) { | |
| return create_effect(RENDER_EFFECT | flags2, fn); | |
| } | |
| function template_effect(fn, sync = [], async = [], blockers = []) { | |
| flatten(blockers, sync, async, (values) => { | |
| create_effect(RENDER_EFFECT, () => fn(...values.map(get))); | |
| }); | |
| } | |
| function block(fn, flags2 = 0) { | |
| var effect2 = create_effect(BLOCK_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function managed(fn, flags2 = 0) { | |
| var effect2 = create_effect(MANAGED_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function branch(fn) { | |
| return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn); | |
| } | |
| function execute_effect_teardown(effect2) { | |
| var teardown2 = effect2.teardown; | |
| if (teardown2 !== null) { | |
| const previously_destroying_effect = is_destroying_effect; | |
| const previous_reaction = active_reaction; | |
| set_is_destroying_effect(true); | |
| set_active_reaction(null); | |
| try { | |
| teardown2.call(null); | |
| } finally { | |
| set_is_destroying_effect(previously_destroying_effect); | |
| set_active_reaction(previous_reaction); | |
| } | |
| } | |
| } | |
| function destroy_effect_children(signal, remove_dom = false) { | |
| var effect2 = signal.first; | |
| signal.first = signal.last = null; | |
| while (effect2 !== null) { | |
| const controller = effect2.ac; | |
| if (controller !== null) { | |
| without_reactive_context(() => { | |
| controller.abort(STALE_REACTION); | |
| }); | |
| } | |
| var next2 = effect2.next; | |
| if ((effect2.f & ROOT_EFFECT) !== 0) { | |
| effect2.parent = null; | |
| } else { | |
| destroy_effect(effect2, remove_dom); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_block_effect_children(signal) { | |
| var effect2 = signal.first; | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if ((effect2.f & BRANCH_EFFECT) === 0) { | |
| destroy_effect(effect2); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_effect(effect2, remove_dom = true) { | |
| var removed = false; | |
| if ((remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes !== null && effect2.nodes.end !== null) { | |
| remove_effect_dom( | |
| effect2.nodes.start, | |
| /** @type {TemplateNode} */ | |
| effect2.nodes.end | |
| ); | |
| removed = true; | |
| } | |
| set_signal_status(effect2, DESTROYING); | |
| destroy_effect_children(effect2, remove_dom && !removed); | |
| remove_reactions(effect2, 0); | |
| var transitions = effect2.nodes && effect2.nodes.t; | |
| if (transitions !== null) { | |
| for (const transition of transitions) { | |
| transition.stop(); | |
| } | |
| } | |
| execute_effect_teardown(effect2); | |
| effect2.f ^= DESTROYING; | |
| effect2.f |= DESTROYED; | |
| var parent = effect2.parent; | |
| if (parent !== null && parent.first !== null) { | |
| unlink_effect(effect2); | |
| } | |
| effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes = effect2.ac = effect2.b = null; | |
| } | |
| function remove_effect_dom(node, end) { | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function unlink_effect(effect2) { | |
| var parent = effect2.parent; | |
| var prev = effect2.prev; | |
| var next2 = effect2.next; | |
| if (prev !== null) prev.next = next2; | |
| if (next2 !== null) next2.prev = prev; | |
| if (parent !== null) { | |
| if (parent.first === effect2) parent.first = next2; | |
| if (parent.last === effect2) parent.last = prev; | |
| } | |
| } | |
| function pause_effect(effect2, callback, destroy = true) { | |
| var transitions = []; | |
| pause_children(effect2, transitions, true); | |
| var fn = () => { | |
| if (destroy) destroy_effect(effect2); | |
| if (callback) callback(); | |
| }; | |
| var remaining = transitions.length; | |
| if (remaining > 0) { | |
| var check = () => --remaining || fn(); | |
| for (var transition of transitions) { | |
| transition.out(check); | |
| } | |
| } else { | |
| fn(); | |
| } | |
| } | |
| function pause_children(effect2, transitions, local) { | |
| if ((effect2.f & INERT) !== 0) return; | |
| effect2.f ^= INERT; | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transitions.push(transition); | |
| } | |
| } | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| if ((child2.f & ROOT_EFFECT) === 0) { | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || // If this is a branch effect without a block effect parent, | |
| // it means the parent block effect was pruned. In that case, | |
| // transparency information was transferred to the branch effect. | |
| (child2.f & BRANCH_EFFECT) !== 0 && (effect2.f & BLOCK_EFFECT) !== 0; | |
| pause_children(child2, transitions, transparent ? local : false); | |
| } | |
| child2 = sibling2; | |
| } | |
| } | |
| function resume_effect(effect2) { | |
| resume_children(effect2, true); | |
| } | |
| function resume_children(effect2, local) { | |
| if ((effect2.f & INERT) === 0) return; | |
| effect2.f ^= INERT; | |
| if ((effect2.f & CLEAN) === 0) { | |
| set_signal_status(effect2, DIRTY); | |
| Batch.ensure().schedule(effect2); | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; | |
| resume_children(child2, transparent ? local : false); | |
| child2 = sibling2; | |
| } | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transition.in(); | |
| } | |
| } | |
| } | |
| } | |
| function move_effect(effect2, fragment) { | |
| if (!effect2.nodes) return; | |
| var node = effect2.nodes.start; | |
| var end = effect2.nodes.end; | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| fragment.append(node); | |
| node = next2; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get$1(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get$1(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get$1(scope.store), name); | |
| } | |
| scope.store.set(get$1(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (official website)", | |
| cancel: "Cancel", | |
| enterCode: "Enter code", | |
| enterCodeAria: "Enter code you hear. Press Space to play audio.", | |
| enterCodeFromImage: "To proceed, please enter the code from the image below.", | |
| error: "Verification failed. Try again later.", | |
| expired: "Verification expired. Try again.", | |
| footer: 'Protected by <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (official website)">ALTCHA</a>', | |
| getAudioChallenge: "Get an audio challenge", | |
| label: "I'm not a robot", | |
| loading: "Loading...", | |
| reload: "Reload", | |
| verify: "Verify", | |
| verificationRequired: "Verification required!", | |
| verified: "Verified", | |
| verifying: "Verifying...", | |
| waitAlert: "Verifying... please wait." | |
| }; | |
| globalThis.$altcha.i18n.set("en", i18n); | |
| const PUBLIC_VERSION = "5"; | |
| if (typeof window !== "undefined") { | |
| ((window.__svelte ??= {}).v ??= /* @__PURE__ */ new Set()).add(PUBLIC_VERSION); | |
| } | |
| const event_symbol = /* @__PURE__ */ Symbol("events"); | |
| const all_registered_events = /* @__PURE__ */ new Set(); | |
| const root_event_handles = /* @__PURE__ */ new Set(); | |
| function create_event(event_name, dom, handler, options = {}) { | |
| function target_handler(event2) { | |
| if (!options.capture) { | |
| handle_event_propagation.call(dom, event2); | |
| } | |
| if (!event2.cancelBubble) { | |
| return without_reactive_context(() => { | |
| return handler?.call(this, event2); | |
| }); | |
| } | |
| } | |
| if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") { | |
| queue_micro_task(() => { | |
| dom.addEventListener(event_name, target_handler, options); | |
| }); | |
| } else { | |
| dom.addEventListener(event_name, target_handler, options); | |
| } | |
| return target_handler; | |
| } | |
| function event(event_name, dom, handler, capture2, passive) { | |
| var options = { capture: capture2, passive }; | |
| var target_handler = create_event(event_name, dom, handler, options); | |
| if (dom === document.body || // @ts-ignore | |
| dom === window || // @ts-ignore | |
| dom === document || // Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed | |
| dom instanceof HTMLMediaElement) { | |
| teardown(() => { | |
| dom.removeEventListener(event_name, target_handler, options); | |
| }); | |
| } | |
| } | |
| function delegated(event_name, element, handler) { | |
| (element[event_symbol] ??= {})[event_name] = handler; | |
| } | |
| function delegate(events) { | |
| for (var i = 0; i < events.length; i++) { | |
| all_registered_events.add(events[i]); | |
| } | |
| for (var fn of root_event_handles) { | |
| fn(events); | |
| } | |
| } | |
| let last_propagated_event = null; | |
| function handle_event_propagation(event2) { | |
| var handler_element = this; | |
| var owner_document = ( | |
| /** @type {Node} */ | |
| handler_element.ownerDocument | |
| ); | |
| var event_name = event2.type; | |
| var path = event2.composedPath?.() || []; | |
| var current_target = ( | |
| /** @type {null | Element} */ | |
| path[0] || event2.target | |
| ); | |
| last_propagated_event = event2; | |
| var path_idx = 0; | |
| var handled_at = last_propagated_event === event2 && event2[event_symbol]; | |
| if (handled_at) { | |
| var at_idx = path.indexOf(handled_at); | |
| if (at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ | |
| window)) { | |
| event2[event_symbol] = handler_element; | |
| return; | |
| } | |
| var handler_idx = path.indexOf(handler_element); | |
| if (handler_idx === -1) { | |
| return; | |
| } | |
| if (at_idx <= handler_idx) { | |
| path_idx = at_idx; | |
| } | |
| } | |
| current_target = /** @type {Element} */ | |
| path[path_idx] || event2.target; | |
| if (current_target === handler_element) return; | |
| define_property(event2, "currentTarget", { | |
| configurable: true, | |
| get() { | |
| return current_target || owner_document; | |
| } | |
| }); | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| var throw_error; | |
| var other_errors = []; | |
| while (current_target !== null) { | |
| var parent_element = current_target.assignedSlot || current_target.parentNode || /** @type {any} */ | |
| current_target.host || null; | |
| try { | |
| var delegated2 = current_target[event_symbol]?.[event_name]; | |
| if (delegated2 != null && (!/** @type {any} */ | |
| current_target.disabled || // DOM could've been updated already by the time this is reached, so we check this as well | |
| // -> the target could not have been disabled because it emits the event in the first place | |
| event2.target === current_target)) { | |
| delegated2.call(current_target, event2); | |
| } | |
| } catch (error) { | |
| if (throw_error) { | |
| other_errors.push(error); | |
| } else { | |
| throw_error = error; | |
| } | |
| } | |
| if (event2.cancelBubble || parent_element === handler_element || parent_element === null) { | |
| break; | |
| } | |
| current_target = parent_element; | |
| } | |
| if (throw_error) { | |
| for (let error of other_errors) { | |
| queueMicrotask(() => { | |
| throw error; | |
| }); | |
| } | |
| throw throw_error; | |
| } | |
| } finally { | |
| event2[event_symbol] = handler_element; | |
| delete event2.currentTarget; | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| const policy = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| globalThis?.window?.trustedTypes && /* @__PURE__ */ globalThis.window.trustedTypes.createPolicy("svelte-trusted-html", { | |
| /** @param {string} html */ | |
| createHTML: (html2) => { | |
| return html2; | |
| } | |
| }) | |
| ); | |
| function create_trusted_html(html2) { | |
| return ( | |
| /** @type {string} */ | |
| policy?.createHTML(html2) ?? html2 | |
| ); | |
| } | |
| function create_fragment_from_html(html2) { | |
| var elem = create_element("template"); | |
| elem.innerHTML = create_trusted_html(html2.replaceAll("<!>", "<!---->")); | |
| return elem.content; | |
| } | |
| function assign_nodes(start, end) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| if (effect2.nodes === null) { | |
| effect2.nodes = { start, end, a: null, t: null }; | |
| } | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_html(content, flags2) { | |
| var is_fragment = (flags2 & TEMPLATE_FRAGMENT) !== 0; | |
| var use_import_node = (flags2 & TEMPLATE_USE_IMPORT_NODE) !== 0; | |
| var node; | |
| var has_start = !content.startsWith("<!>"); | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (node === void 0) { | |
| node = create_fragment_from_html(has_start ? content : "<!>" + content); | |
| if (!is_fragment) node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(node); | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true) | |
| ); | |
| if (is_fragment) { | |
| var start = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(clone) | |
| ); | |
| var end = ( | |
| /** @type {TemplateNode} */ | |
| clone.lastChild | |
| ); | |
| assign_nodes(start, end); | |
| } else { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_namespace(content, flags2, ns = "svg") { | |
| var has_start = !content.startsWith("<!>"); | |
| var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`; | |
| var node; | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (!node) { | |
| var fragment = ( | |
| /** @type {DocumentFragment} */ | |
| create_fragment_from_html(wrapped) | |
| ); | |
| var root2 = ( | |
| /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(fragment) | |
| ); | |
| { | |
| node = /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(root2); | |
| } | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| node.cloneNode(true) | |
| ); | |
| { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_svg(content, flags2) { | |
| return /* @__PURE__ */ from_namespace(content, flags2, "svg"); | |
| } | |
| function text(value = "") { | |
| if (!hydrating) { | |
| var t = create_text(value + ""); | |
| assign_nodes(t, t); | |
| return t; | |
| } | |
| var node = hydrate_node; | |
| if (node.nodeType !== TEXT_NODE) { | |
| node.before(node = create_text()); | |
| set_hydrate_node(node); | |
| } else { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| node | |
| ); | |
| } | |
| assign_nodes(node, node); | |
| return node; | |
| } | |
| function comment() { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| var frag = document.createDocumentFragment(); | |
| var start = document.createComment(""); | |
| var anchor = create_text(); | |
| frag.append(start, anchor); | |
| assign_nodes(start, anchor); | |
| return frag; | |
| } | |
| function append(anchor, dom) { | |
| if (hydrating) { | |
| var effect2 = ( | |
| /** @type {Effect & { nodes: EffectNodes }} */ | |
| active_effect | |
| ); | |
| if ((effect2.f & REACTION_RAN) === 0 || effect2.nodes.end === null) { | |
| effect2.nodes.end = hydrate_node; | |
| } | |
| hydrate_next(); | |
| return; | |
| } | |
| if (anchor === null) { | |
| return; | |
| } | |
| anchor.before( | |
| /** @type {Node} */ | |
| dom | |
| ); | |
| } | |
| function is_capture_event(name) { | |
| return name.endsWith("capture") && name !== "gotpointercapture" && name !== "lostpointercapture"; | |
| } | |
| const DELEGATED_EVENTS = [ | |
| "beforeinput", | |
| "click", | |
| "change", | |
| "dblclick", | |
| "contextmenu", | |
| "focusin", | |
| "focusout", | |
| "input", | |
| "keydown", | |
| "keyup", | |
| "mousedown", | |
| "mousemove", | |
| "mouseout", | |
| "mouseover", | |
| "mouseup", | |
| "pointerdown", | |
| "pointermove", | |
| "pointerout", | |
| "pointerover", | |
| "pointerup", | |
| "touchend", | |
| "touchmove", | |
| "touchstart" | |
| ]; | |
| function can_delegate_event(event_name) { | |
| return DELEGATED_EVENTS.includes(event_name); | |
| } | |
| const ATTRIBUTE_ALIASES = { | |
| // no `class: 'className'` because we handle that separately | |
| formnovalidate: "formNoValidate", | |
| ismap: "isMap", | |
| nomodule: "noModule", | |
| playsinline: "playsInline", | |
| readonly: "readOnly", | |
| defaultvalue: "defaultValue", | |
| defaultchecked: "defaultChecked", | |
| srcobject: "srcObject", | |
| novalidate: "noValidate", | |
| allowfullscreen: "allowFullscreen", | |
| disablepictureinpicture: "disablePictureInPicture", | |
| disableremoteplayback: "disableRemotePlayback" | |
| }; | |
| function normalize_attribute(name) { | |
| name = name.toLowerCase(); | |
| return ATTRIBUTE_ALIASES[name] ?? name; | |
| } | |
| const PASSIVE_EVENTS = ["touchstart", "touchmove"]; | |
| function is_passive_event(name) { | |
| return PASSIVE_EVENTS.includes(name); | |
| } | |
| function set_text(text2, value) { | |
| var str = value == null ? "" : typeof value === "object" ? `${value}` : value; | |
| if (str !== /** @type {any} */ | |
| (text2[TEXT_CACHE] ??= text2.nodeValue)) { | |
| text2[TEXT_CACHE] = str; | |
| text2.nodeValue = `${str}`; | |
| } | |
| } | |
| function mount(component2, options) { | |
| return _mount(component2, options); | |
| } | |
| function hydrate(component2, options) { | |
| init_operations(); | |
| options.intro = options.intro ?? false; | |
| const target = options.target; | |
| const was_hydrating = hydrating; | |
| const previous_hydrate_node = hydrate_node; | |
| try { | |
| var anchor = /* @__PURE__ */ get_first_child(target); | |
| while (anchor && (anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| anchor.data !== HYDRATION_START)) { | |
| anchor = /* @__PURE__ */ get_next_sibling(anchor); | |
| } | |
| if (!anchor) { | |
| throw HYDRATION_ERROR; | |
| } | |
| set_hydrating(true); | |
| set_hydrate_node( | |
| /** @type {Comment} */ | |
| anchor | |
| ); | |
| const instance = _mount(component2, { ...options, anchor }); | |
| set_hydrating(false); | |
| return ( | |
| /** @type {Exports} */ | |
| instance | |
| ); | |
| } catch (error) { | |
| if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) { | |
| throw error; | |
| } | |
| if (error !== HYDRATION_ERROR) { | |
| console.warn("Failed to hydrate: ", error); | |
| } | |
| if (options.recover === false) { | |
| hydration_failed(); | |
| } | |
| init_operations(); | |
| clear_text_content(target); | |
| set_hydrating(false); | |
| return mount(component2, options); | |
| } finally { | |
| set_hydrating(was_hydrating); | |
| set_hydrate_node(previous_hydrate_node); | |
| } | |
| } | |
| const listeners = /* @__PURE__ */ new Map(); | |
| function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) { | |
| init_operations(); | |
| var component2 = void 0; | |
| var unmount2 = component_root(() => { | |
| var anchor_node = anchor ?? target.appendChild(create_text()); | |
| boundary( | |
| /** @type {TemplateNode} */ | |
| anchor_node, | |
| { | |
| pending: () => { | |
| } | |
| }, | |
| (anchor_node2) => { | |
| push({}); | |
| var ctx = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| if (context) ctx.c = context; | |
| if (events) { | |
| props.$$events = events; | |
| } | |
| if (hydrating) { | |
| assign_nodes( | |
| /** @type {TemplateNode} */ | |
| anchor_node2, | |
| null | |
| ); | |
| } | |
| component2 = Component(anchor_node2, props) || {}; | |
| if (hydrating) { | |
| active_effect.nodes.end = hydrate_node; | |
| if (hydrate_node === null || hydrate_node.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| hydrate_node.data !== HYDRATION_END) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| } | |
| pop(); | |
| }, | |
| transformError | |
| ); | |
| var registered_events = /* @__PURE__ */ new Set(); | |
| var event_handle = (events2) => { | |
| for (var i = 0; i < events2.length; i++) { | |
| var event_name = events2[i]; | |
| if (registered_events.has(event_name)) continue; | |
| registered_events.add(event_name); | |
| var passive = is_passive_event(event_name); | |
| for (const node of [target, document]) { | |
| var counts = listeners.get(node); | |
| if (counts === void 0) { | |
| counts = /* @__PURE__ */ new Map(); | |
| listeners.set(node, counts); | |
| } | |
| var count = counts.get(event_name); | |
| if (count === void 0) { | |
| node.addEventListener(event_name, handle_event_propagation, { passive }); | |
| counts.set(event_name, 1); | |
| } else { | |
| counts.set(event_name, count + 1); | |
| } | |
| } | |
| } | |
| }; | |
| event_handle(array_from(all_registered_events)); | |
| root_event_handles.add(event_handle); | |
| return () => { | |
| for (var event_name of registered_events) { | |
| for (const node of [target, document]) { | |
| var counts = ( | |
| /** @type {Map<string, number>} */ | |
| listeners.get(node) | |
| ); | |
| var count = ( | |
| /** @type {number} */ | |
| counts.get(event_name) | |
| ); | |
| if (--count == 0) { | |
| node.removeEventListener(event_name, handle_event_propagation); | |
| counts.delete(event_name); | |
| if (counts.size === 0) { | |
| listeners.delete(node); | |
| } | |
| } else { | |
| counts.set(event_name, count); | |
| } | |
| } | |
| } | |
| root_event_handles.delete(event_handle); | |
| if (anchor_node !== anchor) { | |
| anchor_node.parentNode?.removeChild(anchor_node); | |
| } | |
| }; | |
| }); | |
| mounted_components.set(component2, unmount2); | |
| return component2; | |
| } | |
| let mounted_components = /* @__PURE__ */ new WeakMap(); | |
| function unmount(component2, options) { | |
| const fn = mounted_components.get(component2); | |
| if (fn) { | |
| mounted_components.delete(component2); | |
| return fn(options); | |
| } | |
| return Promise.resolve(); | |
| } | |
| class BranchManager { | |
| /** @type {TemplateNode} */ | |
| anchor; | |
| /** @type {Map<Batch, Key>} */ | |
| #batches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Map of keys to effects that are currently rendered in the DOM. | |
| * These effects are visible and actively part of the document tree. | |
| * Example: | |
| * |
변경 전i18n.js
변경 후i18n.js
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
변경 전gd_board_view.js
| $(document).ready(function () { | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| $(document).ready(function () { | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 후gd_board_view.js
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 전gd_board_write.js
| function gd_captcha_reload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function gd_add_upload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js_board_layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popupSelectGoods').empty().append(data); | |
| $('#popupSelectGoods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js_layer_close',function(e){ | |
| e.stopPropagation(); | |
| $('.js_select_confirm').off('click'); | |
| $('#popupSelectGoods').empty(); | |
| $('#popupSelectGoods').hide(); | |
| }) | |
| $('body').on('click','.js_select_remove',function(){ | |
| $(this).closest('div.js_select_item').remove(); | |
| $('.itemselect_comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file_upload').length; | |
| $('.file_upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file_upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| gd_add_upload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("#contents").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function gd_init_file_upload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = gd_get_prev_img(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#boardAttach li.item.template").clone(); | |
| $("#boardAttach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file_face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#boardAttach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#boardAttach li.item.template').off().on("click", 'button.file_face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file_face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file_hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#boardAttach li.item:not(.template) input.file_hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| fileHidden.onchange = function () { | |
| var index = $("#boardAttach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = gd_get_prev_img(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#boardAttach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function gd_get_prev_img(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function gd_set_add_goods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
| function gd_set_add_order(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
| function gd_captcha_reload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function gd_add_upload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js_board_layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popupSelectGoods').empty().append(data); | |
| $('#popupSelectGoods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js_layer_close',function(e){ | |
| e.stopPropagation(); | |
| $('.js_select_confirm').off('click'); | |
| $('#popupSelectGoods').empty(); | |
| $('#popupSelectGoods').hide(); | |
| }) | |
| $('body').on('click','.js_select_remove',function(){ | |
| $(this).closest('div.js_select_item').remove(); | |
| $('.itemselect_comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file_upload').length; | |
| $('.file_upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file_upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| gd_add_upload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("#contents").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function gd_init_file_upload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = gd_get_prev_img(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#boardAttach li.item.template").clone(); | |
| $("#boardAttach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file_face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#boardAttach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#boardAttach li.item.template').off().on("click", 'button.file_face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file_face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file_hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#boardAttach li.item:not(.template) input.file_hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| fileHidden.onchange = function () { | |
| var index = $("#boardAttach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = gd_get_prev_img(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#boardAttach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function gd_get_prev_img(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function gd_set_add_goods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
| function gd_set_add_order(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
변경 후gd_board_write.js
| function gd_captcha_reload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function gd_add_upload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js_board_layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popupSelectGoods').empty().append(data); | |
| $('#popupSelectGoods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js_layer_close',function(e){ | |
| e.stopPropagation(); | |
| $('.js_select_confirm').off('click'); | |
| $('#popupSelectGoods').empty(); | |
| $('#popupSelectGoods').hide(); | |
| }) | |
| $('body').on('click','.js_select_remove',function(){ | |
| $(this).closest('div.js_select_item').remove(); | |
| $('.itemselect_comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file_upload').length; | |
| $('.file_upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file_upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| gd_add_upload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("#contents").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function gd_init_file_upload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = gd_get_prev_img(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#boardAttach li.item.template").clone(); | |
| $("#boardAttach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file_face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#boardAttach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#boardAttach li.item.template').off().on("click", 'button.file_face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file_face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file_hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#boardAttach li.item:not(.template) input.file_hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| fileHidden.onchange = function () { | |
| var index = $("#boardAttach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = gd_get_prev_img(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#boardAttach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function gd_get_prev_img(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function gd_set_add_goods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
| function gd_set_add_order(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
| function gd_captcha_reload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function gd_add_upload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js_board_layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popupSelectGoods').empty().append(data); | |
| $('#popupSelectGoods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js_layer_close',function(e){ | |
| e.stopPropagation(); | |
| $('.js_select_confirm').off('click'); | |
| $('#popupSelectGoods').empty(); | |
| $('#popupSelectGoods').hide(); | |
| }) | |
| $('body').on('click','.js_select_remove',function(){ | |
| $(this).closest('div.js_select_item').remove(); | |
| $('.itemselect_comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file_upload').length; | |
| $('.file_upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file_upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| gd_add_upload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("#category").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("#contents").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function gd_init_file_upload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = gd_get_prev_img(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#boardAttach li.item.template").clone(); | |
| $("#boardAttach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file_face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#boardAttach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#boardAttach li.item.template').off().on("click", 'button.file_face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file_face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file_hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#boardAttach li.item:not(.template) input.file_hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| fileHidden.onchange = function () { | |
| var index = $("#boardAttach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = gd_get_prev_img(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#boardAttach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function gd_get_prev_img(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function gd_set_add_goods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
| function gd_set_add_order(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect_comment').hide(); | |
| } | |
변경 전gd_common.js
| return formatted; | |
| }; | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = | |
| (obj).contentWindow.document.body.clientHeight; | |
변경 후gd_common.js
| return formatted; | |
| }; | |
| /* iframe(mypage 등)으로 board 목록이 실릴 때, onload 1회 측정(resize_frame/gd_resize_frame) 이후에도 | |
| 댓글/답글 폼 토글, ALTCHA 위젯 지연 렌더, 댓글 등록/삭제 등으로 내용 높이가 바뀌면 | |
| 부모 iframe 높이를 다시 맞춘다. body 높이가 실제로 변했을 때만 호출해 재측정 루프를 방지. */ | |
| (function () { | |
| let parentResize; | |
| try { | |
| if (window.parent === window) { | |
| return; // 최상위 문서 → 대상 아님 | |
| } | |
| parentResize = window.parent.gd_resize_frame || window.parent.resize_frame; | |
| } catch (e) { | |
| return; // cross-origin 부모 → 접근 불가, 대상 아님 | |
| } | |
| if (typeof parentResize !== 'function' || typeof window.ResizeObserver === 'undefined') { | |
| return; | |
| } | |
| const startObserve = function () { | |
| const frameEl = window.frameElement | |
| || (window.name ? window.parent.document.getElementsByName(window.name)[0] : null); | |
| if (!frameEl || !document.body) { | |
| return; | |
| } | |
| let timer = null; | |
| let lastHeight = -1; | |
| const observer = new ResizeObserver(function () { | |
| if (timer) { | |
| clearTimeout(timer); | |
| } | |
| timer = setTimeout(function () { | |
| const height = document.body.clientHeight; | |
| if (height === lastHeight) { | |
| return; // 실제 콘텐츠 높이 변화 없음 → 재측정 루프 방지 | |
| } | |
| lastHeight = height; | |
| parentResize.call(window.parent, frameEl); | |
| }, 100); | |
| }); | |
| observer.observe(document.body); | |
| }; | |
| if (document.body) { | |
| startObserve(); | |
| } else { | |
| document.addEventListener('DOMContentLoaded', startObserve); | |
| } | |
| })(); | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = | |
| (obj).contentWindow.document.body.clientHeight; | |
변경 전gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: function () { | |
| return alert(__('자동등록방지 문자를 입력해주세요.')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| $(form).find('select').prop('disabled', false); | |
| $('.join_ok_btn').attr("disabled", true); | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: function () { | |
| return alert(__('자동등록방지 문자를 입력해주세요.')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| $(form).find('select').prop('disabled', false); | |
| $('.join_ok_btn').attr("disabled", true); | |
변경 후gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $(form).find('select').prop('disabled', false); | |
| $('.join_ok_btn').attr("disabled", true); | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $(form).find('select').prop('disabled', false); | |
| $('.join_ok_btn').attr("disabled", true); | |
변경 전join.html
| </form> | |
| </div> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| </form> | |
| </div> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
변경 후join.html
| </form> | |
| </div> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| </form> | |
| </div> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
변경 전_join_view_captcha.html
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="./captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" id="reload_captcha" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="./captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" id="reload_captcha" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
변경 후_join_view_captcha.html
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </div> | |
| <!--{/}--> | |
변경 전_altcha.html
변경 후_altcha.html
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Mobile\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Mobile\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
변경 전view.html
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전view.html
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전view.html
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_action">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <div class="comment_input"><textarea class="memo" name="memo" placeholder="{=__('댓글을 작성하세요.')}"></textarea></div> | |
| <div class="comment_btn"><button type="button" class="view_comment_btn js_comment_btn_write">{=__('작성 완료')}</button></div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동방지등록 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동방지등록 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_default"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_event"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_gallery"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_captcha_reload()" class="captchareload_btn"><img src="img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="write_qa"> | |
| <div class="ly_head"> | |
| <h1 class="h_tit">{=__('글쓰기')}</h1> | |
| </dl> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdPrivateYN == "y" }--> | |
변경 전goods_board_qa_list.html
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 후goods_board_qa_list.html
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 전goods_board_review_list.html
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 후goods_board_review_list.html
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
변경 전goods_board_view.html
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl&2 }--> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="../board/captcha.php" class="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" onclick="gd_reload_reply_captcha()" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후goods_board_view.html
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전goods_view.html
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
변경 후goods_view.html
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx310"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
변경 전altcha.js
변경 후altcha.js
| const DEV = false; | |
| var is_array = Array.isArray; | |
| var index_of = Array.prototype.indexOf; | |
| var includes = Array.prototype.includes; | |
| var array_from = Array.from; | |
| var object_keys = Object.keys; | |
| var define_property = Object.defineProperty; | |
| var get_descriptor = Object.getOwnPropertyDescriptor; | |
| var get_descriptors = Object.getOwnPropertyDescriptors; | |
| var object_prototype = Object.prototype; | |
| var array_prototype = Array.prototype; | |
| var get_prototype_of = Object.getPrototypeOf; | |
| var is_extensible = Object.isExtensible; | |
| const noop = () => { | |
| }; | |
| function run_all(arr) { | |
| for (var i = 0; i < arr.length; i++) { | |
| arr[i](); | |
| } | |
| } | |
| function deferred() { | |
| var resolve; | |
| var reject; | |
| var promise = new Promise((res, rej) => { | |
| resolve = res; | |
| reject = rej; | |
| }); | |
| return { promise, resolve, reject }; | |
| } | |
| const DERIVED = 1 << 1; | |
| const EFFECT = 1 << 2; | |
| const RENDER_EFFECT = 1 << 3; | |
| const MANAGED_EFFECT = 1 << 24; | |
| const BLOCK_EFFECT = 1 << 4; | |
| const BRANCH_EFFECT = 1 << 5; | |
| const ROOT_EFFECT = 1 << 6; | |
| const BOUNDARY_EFFECT = 1 << 7; | |
| const CONNECTED = 1 << 9; | |
| const CLEAN = 1 << 10; | |
| const DIRTY = 1 << 11; | |
| const MAYBE_DIRTY = 1 << 12; | |
| const INERT = 1 << 13; | |
| const DESTROYED = 1 << 14; | |
| const REACTION_RAN = 1 << 15; | |
| const DESTROYING = 1 << 25; | |
| const EFFECT_TRANSPARENT = 1 << 16; | |
| const EAGER_EFFECT = 1 << 17; | |
| const HEAD_EFFECT = 1 << 18; | |
| const EFFECT_PRESERVED = 1 << 19; | |
| const USER_EFFECT = 1 << 20; | |
| const WAS_MARKED = 1 << 16; | |
| const REACTION_IS_UPDATING = 1 << 21; | |
| const ASYNC = 1 << 22; | |
| const ERROR_VALUE = 1 << 23; | |
| const STATE_SYMBOL = /* @__PURE__ */ Symbol("$state"); | |
| const LEGACY_PROPS = /* @__PURE__ */ Symbol("legacy props"); | |
| const LOADING_ATTR_SYMBOL = /* @__PURE__ */ Symbol(""); | |
| const ATTRIBUTES_CACHE = /* @__PURE__ */ Symbol("attributes"); | |
| const CLASS_CACHE = /* @__PURE__ */ Symbol("class"); | |
| const STYLE_CACHE = /* @__PURE__ */ Symbol("style"); | |
| const TEXT_CACHE = /* @__PURE__ */ Symbol("text"); | |
| const FORM_RESET_HANDLER = /* @__PURE__ */ Symbol("form reset"); | |
| const STALE_REACTION = new class StaleReactionError extends Error { | |
| name = "StaleReactionError"; | |
| message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; | |
| }(); | |
| const IS_XHTML = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| !!globalThis.document?.contentType && /* @__PURE__ */ globalThis.document.contentType.includes("xml") | |
| ); | |
| const TEXT_NODE = 3; | |
| const COMMENT_NODE = 8; | |
| function equals(value) { | |
| return value === this.v; | |
| } | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function safe_equals(value) { | |
| return !safe_not_equal(value, this.v); | |
| } | |
| function lifecycle_outside_component(name) { | |
| { | |
| throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); | |
| } | |
| } | |
| function async_derived_orphan() { | |
| { | |
| throw new Error(`https://svelte.dev/e/async_derived_orphan`); | |
| } | |
| } | |
| function effect_in_teardown(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_teardown`); | |
| } | |
| } | |
| function effect_in_unowned_derived() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); | |
| } | |
| } | |
| function effect_orphan(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_orphan`); | |
| } | |
| } | |
| function effect_update_depth_exceeded() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); | |
| } | |
| } | |
| function hydration_failed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/hydration_failed`); | |
| } | |
| } | |
| function state_descriptors_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); | |
| } | |
| } | |
| function state_prototype_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_prototype_fixed`); | |
| } | |
| } | |
| function state_unsafe_mutation() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); | |
| } | |
| } | |
| function svelte_boundary_reset_onerror() { | |
| { | |
| throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); | |
| } | |
| } | |
| let tracing_mode_flag = false; | |
| const TEMPLATE_FRAGMENT = 1; | |
| const TEMPLATE_USE_IMPORT_NODE = 1 << 1; | |
| const HYDRATION_START = "["; | |
| const HYDRATION_START_ELSE = "[!"; | |
| const HYDRATION_START_FAILED = "[?"; | |
| const HYDRATION_END = "]"; | |
| const HYDRATION_ERROR = {}; | |
| const UNINITIALIZED = /* @__PURE__ */ Symbol("uninitialized"); | |
| const NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; | |
| const NAMESPACE_SVG = "http://www.w3.org/2000/svg"; | |
| const NAMESPACE_MATHML = "http://www.w3.org/1998/Math/MathML"; | |
| const ATTACHMENT_KEY = "@attach"; | |
| let component_context = null; | |
| function set_component_context(context) { | |
| component_context = context; | |
| } | |
| function push(props, runes = false, fn) { | |
| component_context = { | |
| p: component_context, | |
| i: false, | |
| c: null, | |
| e: null, | |
| s: props, | |
| x: null, | |
| r: ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ), | |
| l: null | |
| }; | |
| } | |
| function pop(component2) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| var effects = context.e; | |
| if (effects !== null) { | |
| context.e = null; | |
| for (var fn of effects) { | |
| create_user_effect(fn); | |
| } | |
| } | |
| if (component2 !== void 0) { | |
| context.x = component2; | |
| } | |
| context.i = true; | |
| component_context = context.p; | |
| return component2 ?? /** @type {T} */ | |
| {}; | |
| } | |
| function is_runes() { | |
| return true; | |
| } | |
| let micro_tasks = []; | |
| function run_micro_tasks() { | |
| var tasks = micro_tasks; | |
| micro_tasks = []; | |
| run_all(tasks); | |
| } | |
| function queue_micro_task(fn) { | |
| if (micro_tasks.length === 0 && !is_flushing_sync) { | |
| var tasks = micro_tasks; | |
| queueMicrotask(() => { | |
| if (tasks === micro_tasks) run_micro_tasks(); | |
| }); | |
| } | |
| micro_tasks.push(fn); | |
| } | |
| function flush_tasks() { | |
| while (micro_tasks.length > 0) { | |
| run_micro_tasks(); | |
| } | |
| } | |
| function derived_inert() { | |
| { | |
| console.warn(`https://svelte.dev/e/derived_inert`); | |
| } | |
| } | |
| function hydration_mismatch(location2) { | |
| { | |
| console.warn(`https://svelte.dev/e/hydration_mismatch`); | |
| } | |
| } | |
| function select_multiple_invalid_value() { | |
| { | |
| console.warn(`https://svelte.dev/e/select_multiple_invalid_value`); | |
| } | |
| } | |
| function svelte_boundary_reset_noop() { | |
| { | |
| console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`); | |
| } | |
| } | |
| let hydrating = false; | |
| function set_hydrating(value) { | |
| hydrating = value; | |
| } | |
| let hydrate_node; | |
| function set_hydrate_node(node) { | |
| if (node === null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return hydrate_node = node; | |
| } | |
| function hydrate_next() { | |
| return set_hydrate_node(/* @__PURE__ */ get_next_sibling(hydrate_node)); | |
| } | |
| function reset(node) { | |
| if (!hydrating) return; | |
| if (/* @__PURE__ */ get_next_sibling(hydrate_node) !== null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| hydrate_node = node; | |
| } | |
| function next(count = 1) { | |
| if (hydrating) { | |
| var i = count; | |
| var node = hydrate_node; | |
| while (i--) { | |
| node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node); | |
| } | |
| hydrate_node = node; | |
| } | |
| } | |
| function skip_nodes(remove = true) { | |
| var depth = 0; | |
| var node = hydrate_node; | |
| while (true) { | |
| if (node.nodeType === COMMENT_NODE) { | |
| var data = ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| if (data === HYDRATION_END) { | |
| if (depth === 0) return node; | |
| depth -= 1; | |
| } else if (data === HYDRATION_START || data === HYDRATION_START_ELSE || // "[1", "[2", etc. for if blocks | |
| data[0] === "[" && !isNaN(Number(data.slice(1)))) { | |
| depth += 1; | |
| } | |
| } | |
| var next2 = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node) | |
| ); | |
| if (remove) node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function read_hydration_instruction(node) { | |
| if (!node || node.nodeType !== COMMENT_NODE) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| } | |
| function proxy(value) { | |
| if (typeof value !== "object" || value === null || STATE_SYMBOL in value) { | |
| return value; | |
| } | |
| const prototype = get_prototype_of(value); | |
| if (prototype !== object_prototype && prototype !== array_prototype) { | |
| return value; | |
| } | |
| var sources = /* @__PURE__ */ new Map(); | |
| var is_proxied_array = is_array(value); | |
| var version = /* @__PURE__ */ state(0); | |
| var parent_version = update_version; | |
| var with_parent = (fn) => { | |
| if (update_version === parent_version) { | |
| return fn(); | |
| } | |
| var reaction = active_reaction; | |
| var version2 = update_version; | |
| set_active_reaction(null); | |
| set_update_version(parent_version); | |
| var result = fn(); | |
| set_active_reaction(reaction); | |
| set_update_version(version2); | |
| return result; | |
| }; | |
| if (is_proxied_array) { | |
| sources.set("length", /* @__PURE__ */ state( | |
| /** @type {any[]} */ | |
| value.length | |
| )); | |
| } | |
| return new Proxy( | |
| /** @type {any} */ | |
| value, | |
| { | |
| defineProperty(_, prop2, descriptor) { | |
| if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) { | |
| state_descriptors_fixed(); | |
| } | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| with_parent(() => { | |
| var s2 = /* @__PURE__ */ state(descriptor.value); | |
| sources.set(prop2, s2); | |
| return s2; | |
| }); | |
| } else { | |
| set(s, descriptor.value, true); | |
| } | |
| return true; | |
| }, | |
| deleteProperty(target, prop2) { | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| if (prop2 in target) { | |
| const s2 = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(prop2, s2); | |
| increment(version); | |
| } | |
| } else { | |
| set(s, UNINITIALIZED); | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| get(target, prop2, receiver) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return value; | |
| } | |
| var s = sources.get(prop2); | |
| var exists = prop2 in target; | |
| if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) { | |
| s = with_parent(() => { | |
| var p = proxy(exists ? target[prop2] : UNINITIALIZED); | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| if (s !== void 0) { | |
| var v = get(s); | |
| return v === UNINITIALIZED ? void 0 : v; | |
| } | |
| return Reflect.get(target, prop2, receiver); | |
| }, | |
| getOwnPropertyDescriptor(target, prop2) { | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor && "value" in descriptor) { | |
| var s = sources.get(prop2); | |
| if (s) descriptor.value = get(s); | |
| } else if (descriptor === void 0) { | |
| var source2 = sources.get(prop2); | |
| var value2 = source2?.v; | |
| if (source2 !== void 0 && value2 !== UNINITIALIZED) { | |
| return { | |
| enumerable: true, | |
| configurable: true, | |
| value: value2, | |
| writable: true | |
| }; | |
| } | |
| } | |
| return descriptor; | |
| }, | |
| has(target, prop2) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return true; | |
| } | |
| var s = sources.get(prop2); | |
| var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2); | |
| if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) { | |
| if (s === void 0) { | |
| s = with_parent(() => { | |
| var p = has ? proxy(target[prop2]) : UNINITIALIZED; | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| var value2 = get(s); | |
| if (value2 === UNINITIALIZED) { | |
| return false; | |
| } | |
| } | |
| return has; | |
| }, | |
| set(target, prop2, value2, receiver) { | |
| var s = sources.get(prop2); | |
| var has = prop2 in target; | |
| if (is_proxied_array && prop2 === "length") { | |
| for (var i = value2; i < /** @type {Source<number>} */ | |
| s.v; i += 1) { | |
| var other_s = sources.get(i + ""); | |
| if (other_s !== void 0) { | |
| set(other_s, UNINITIALIZED); | |
| } else if (i in target) { | |
| other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(i + "", other_s); | |
| } | |
| } | |
| } | |
| if (s === void 0) { | |
| if (!has || get_descriptor(target, prop2)?.writable) { | |
| s = with_parent(() => /* @__PURE__ */ state(void 0)); | |
| set(s, proxy(value2)); | |
| sources.set(prop2, s); | |
| } | |
| } else { | |
| has = s.v !== UNINITIALIZED; | |
| var p = with_parent(() => proxy(value2)); | |
| set(s, p); | |
| } | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor?.set) { | |
| descriptor.set.call(receiver, value2); | |
| } | |
| if (!has) { | |
| if (is_proxied_array && typeof prop2 === "string") { | |
| var ls = ( | |
| /** @type {Source<number>} */ | |
| sources.get("length") | |
| ); | |
| var n = Number(prop2); | |
| if (Number.isInteger(n) && n >= ls.v) { | |
| set(ls, n + 1); | |
| } | |
| } | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| ownKeys(target) { | |
| get(version); | |
| var own_keys = Reflect.ownKeys(target).filter((key3) => { | |
| var source3 = sources.get(key3); | |
| return source3 === void 0 || source3.v !== UNINITIALIZED; | |
| }); | |
| for (var [key2, source2] of sources) { | |
| if (source2.v !== UNINITIALIZED && !(key2 in target)) { | |
| own_keys.push(key2); | |
| } | |
| } | |
| return own_keys; | |
| }, | |
| setPrototypeOf() { | |
| state_prototype_fixed(); | |
| } | |
| } | |
| ); | |
| } | |
| function get_proxied_value(value) { | |
| try { | |
| if (value !== null && typeof value === "object" && STATE_SYMBOL in value) { | |
| return value[STATE_SYMBOL]; | |
| } | |
| } catch { | |
| } | |
| return value; | |
| } | |
| function is(a, b) { | |
| return Object.is(get_proxied_value(a), get_proxied_value(b)); | |
| } | |
| var $window; | |
| var $document; | |
| var is_firefox; | |
| var first_child_getter; | |
| var next_sibling_getter; | |
| function init_operations() { | |
| if ($window !== void 0) { | |
| return; | |
| } | |
| $window = window; | |
| $document = document; | |
| is_firefox = /Firefox/.test(navigator.userAgent); | |
| var element_prototype = Element.prototype; | |
| var node_prototype = Node.prototype; | |
| var text_prototype = Text.prototype; | |
| first_child_getter = get_descriptor(node_prototype, "firstChild").get; | |
| next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; | |
| if (is_extensible(element_prototype)) { | |
| element_prototype[CLASS_CACHE] = void 0; | |
| element_prototype[ATTRIBUTES_CACHE] = null; | |
| element_prototype[STYLE_CACHE] = void 0; | |
| element_prototype.__e = void 0; | |
| } | |
| if (is_extensible(text_prototype)) { | |
| text_prototype[TEXT_CACHE] = void 0; | |
| } | |
| } | |
| function create_text(value = "") { | |
| return document.createTextNode(value); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_first_child(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| first_child_getter.call(node) | |
| ); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_next_sibling(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| next_sibling_getter.call(node) | |
| ); | |
| } | |
| function child(node, is_text) { | |
| if (!hydrating) { | |
| return /* @__PURE__ */ get_first_child(node); | |
| } | |
| var child2 = /* @__PURE__ */ get_first_child(hydrate_node); | |
| if (child2 === null) { | |
| child2 = hydrate_node.appendChild(create_text()); | |
| } else if (is_text && child2.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| child2?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| if (is_text) { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| child2 | |
| ); | |
| } | |
| set_hydrate_node(child2); | |
| return child2; | |
| } | |
| function first_child(node, is_text = false) { | |
| if (!hydrating) { | |
| var first = /* @__PURE__ */ get_first_child(node); | |
| if (first instanceof Comment && first.data === "") return /* @__PURE__ */ get_next_sibling(first); | |
| return first; | |
| } | |
| if (is_text) { | |
| if (hydrate_node?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| hydrate_node?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| hydrate_node | |
| ); | |
| } | |
| return hydrate_node; | |
| } | |
| function sibling(node, count = 1, is_text = false) { | |
| let next_sibling = hydrating ? hydrate_node : node; | |
| var last_sibling; | |
| while (count--) { | |
| last_sibling = next_sibling; | |
| next_sibling = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(next_sibling); | |
| } | |
| if (!hydrating) { | |
| return next_sibling; | |
| } | |
| if (is_text) { | |
| if (next_sibling?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| if (next_sibling === null) { | |
| last_sibling?.after(text2); | |
| } else { | |
| next_sibling.before(text2); | |
| } | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| next_sibling | |
| ); | |
| } | |
| set_hydrate_node(next_sibling); | |
| return next_sibling; | |
| } | |
| function clear_text_content(node) { | |
| node.textContent = ""; | |
| } | |
| function should_defer_append() { | |
| return false; | |
| } | |
| function create_element(tag, namespace, is2) { | |
| let options = void 0; | |
| return ( | |
| /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ | |
| document.createElementNS(namespace ?? NAMESPACE_HTML, tag, options) | |
| ); | |
| } | |
| function merge_text_nodes(text2) { | |
| if ( | |
| /** @type {string} */ | |
| text2.nodeValue.length < 65536 | |
| ) { | |
| return; | |
| } | |
| let next2 = text2.nextSibling; | |
| while (next2 !== null && next2.nodeType === TEXT_NODE) { | |
| next2.remove(); | |
| text2.nodeValue += /** @type {string} */ | |
| next2.nodeValue; | |
| next2 = text2.nextSibling; | |
| } | |
| } | |
| function handle_error(error) { | |
| var effect2 = active_effect; | |
| if (effect2 === null) { | |
| active_reaction.f |= ERROR_VALUE; | |
| return error; | |
| } | |
| if ((effect2.f & REACTION_RAN) === 0 && (effect2.f & EFFECT) === 0) { | |
| throw error; | |
| } | |
| invoke_error_boundary(error, effect2); | |
| } | |
| function invoke_error_boundary(error, effect2) { | |
| while (effect2 !== null) { | |
| if ((effect2.f & BOUNDARY_EFFECT) !== 0) { | |
| if ((effect2.f & REACTION_RAN) === 0) { | |
| throw error; | |
| } | |
| try { | |
| effect2.b.error(error); | |
| return; | |
| } catch (e) { | |
| error = e; | |
| } | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| throw error; | |
| } | |
| const STATUS_MASK = -7169; | |
| function set_signal_status(signal, status) { | |
| signal.f = signal.f & STATUS_MASK | status; | |
| } | |
| function update_derived_status(derived2) { | |
| if ((derived2.f & CONNECTED) !== 0 || derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| } else { | |
| set_signal_status(derived2, MAYBE_DIRTY); | |
| } | |
| } | |
| function clear_marked(deps) { | |
| if (deps === null) return; | |
| for (const dep of deps) { | |
| if ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) { | |
| continue; | |
| } | |
| dep.f ^= WAS_MARKED; | |
| clear_marked( | |
| /** @type {Derived} */ | |
| dep.deps | |
| ); | |
| } | |
| } | |
| function defer_effect(effect2, dirty_effects, maybe_dirty_effects) { | |
| if ((effect2.f & DIRTY) !== 0) { | |
| dirty_effects.add(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| maybe_dirty_effects.add(effect2); | |
| } | |
| clear_marked(effect2.deps); | |
| set_signal_status(effect2, CLEAN); | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set2(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set2(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set2, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set: set2, update, subscribe }; | |
| } | |
| function get$1(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let IS_UNMOUNTED = /* @__PURE__ */ Symbol("unmounted"); | |
| function store_get(store2, store_name, stores) { | |
| const entry = stores[store_name] ??= { | |
| store: null, | |
| source: /* @__PURE__ */ mutable_source(void 0), | |
| unsubscribe: noop | |
| }; | |
| if (entry.store !== store2 && !(IS_UNMOUNTED in stores)) { | |
| entry.unsubscribe(); | |
| entry.store = store2 ?? null; | |
| if (store2 == null) { | |
| entry.source.v = void 0; | |
| entry.unsubscribe = noop; | |
| } else { | |
| var is_synchronous_callback = true; | |
| entry.unsubscribe = subscribe_to_store(store2, (v) => { | |
| if (is_synchronous_callback) { | |
| entry.source.v = v; | |
| } else { | |
| set(entry.source, v); | |
| } | |
| }); | |
| is_synchronous_callback = false; | |
| } | |
| } | |
| if (store2 && IS_UNMOUNTED in stores) { | |
| return get$1(store2); | |
| } | |
| return get(entry.source); | |
| } | |
| function setup_stores() { | |
| const stores = {}; | |
| function cleanup() { | |
| teardown(() => { | |
| for (var store_name in stores) { | |
| const ref = stores[store_name]; | |
| ref.unsubscribe(); | |
| } | |
| define_property(stores, IS_UNMOUNTED, { | |
| enumerable: false, | |
| value: true | |
| }); | |
| }); | |
| } | |
| return [stores, cleanup]; | |
| } | |
| let first_batch = null; | |
| let last_batch = null; | |
| let current_batch = null; | |
| let previous_batch = null; | |
| let batch_values = null; | |
| let last_scheduled_effect = null; | |
| let is_flushing_sync = false; | |
| let is_processing = false; | |
| let collected_effects = null; | |
| let legacy_updates = null; | |
| var flush_count = 0; | |
| var source_stacks = /* @__PURE__ */ new Set(); | |
| let uid = 1; | |
| class Batch { | |
| id = uid++; | |
| /** True as soon as `#process` was called */ | |
| #started = false; | |
| linked = true; | |
| /** @type {Batch | null} */ | |
| #prev = null; | |
| /** @type {Batch | null} */ | |
| #next = null; | |
| /** @type {Map<Effect, ReturnType<typeof deferred<any>>>} */ | |
| async_deriveds = /* @__PURE__ */ new Map(); | |
| /** | |
| * The current values of any signals that are updated in this batch. | |
| * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment) | |
| * They keys of this map are identical to `this.#previous` | |
| * @type {Map<Value, [any, boolean]>} | |
| */ | |
| current = /* @__PURE__ */ new Map(); | |
| /** | |
| * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place. | |
| * They keys of this map are identical to `this.#current` | |
| * @type {Map<Value, any>} | |
| */ | |
| previous = /* @__PURE__ */ new Map(); | |
| /** | |
| * Async effects which this batch doesn't take into account anymore when calculating blockers, | |
| * as it has a value for it already. | |
| * @type {Set<Effect>} | |
| */ | |
| unblocked = /* @__PURE__ */ new Set(); | |
| /** | |
| * When the batch is committed (and the DOM is updated), we need to remove old branches | |
| * and append new ones by calling the functions added inside (if/each/key/etc) blocks | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * If a fork is discarded, we need to destroy any effects that are no longer needed | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #discard_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * Callbacks that should run only when a fork is committed. | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #fork_commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * The number of async effects that are currently in flight | |
| */ | |
| #pending = 0; | |
| /** | |
| * Async effects that are currently in flight, _not_ inside a pending boundary | |
| * @type {Map<Effect, number>} | |
| */ | |
| #blocking_pending = /* @__PURE__ */ new Map(); | |
| /** | |
| * A deferred that resolves when the batch is committed, used with `settled()` | |
| * TODO replace with Promise.withResolvers once supported widely enough | |
| * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null} | |
| */ | |
| #deferred = null; | |
| /** | |
| * The root effects that need to be flushed | |
| * @type {Effect[]} | |
| */ | |
| #roots = []; | |
| /** | |
| * Effects created while this batch was active. | |
| * @type {Effect[]} | |
| */ | |
| #new_effects = []; | |
| /** | |
| * Deferred effects (which run after async work has completed) that are DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * Deferred effects that are MAYBE_DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A map of branches that still exist, but will be destroyed when this batch | |
| * is committed — we skip over these during `process`. | |
| * The value contains child effects that were dirty/maybe_dirty before being reset, | |
| * so they can be rescheduled if the branch survives. | |
| * @type {Map<Effect, { d: Effect[], m: Effect[] }>} | |
| */ | |
| #skipped_branches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing | |
| * @type {Set<Effect>} | |
| */ | |
| #unskipped_branches = /* @__PURE__ */ new Set(); | |
| is_fork = false; | |
| #decrement_queued = false; | |
| #is_deferred() { | |
| if (this.is_fork) return true; | |
| for (const effect2 of this.#blocking_pending.keys()) { | |
| var e = effect2; | |
| var skipped = false; | |
| while (e.parent !== null) { | |
| if (this.#skipped_branches.has(e)) { | |
| skipped = true; | |
| break; | |
| } | |
| e = e.parent; | |
| } | |
| if (!skipped) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Add an effect to the #skipped_branches map and reset its children | |
| * @param {Effect} effect | |
| */ | |
| skip_effect(effect2) { | |
| if (!this.#skipped_branches.has(effect2)) { | |
| this.#skipped_branches.set(effect2, { d: [], m: [] }); | |
| } | |
| this.#unskipped_branches.delete(effect2); | |
| } | |
| /** | |
| * Remove an effect from the #skipped_branches map and reschedule | |
| * any tracked dirty/maybe_dirty child effects | |
| * @param {Effect} effect | |
| * @param {(e: Effect) => void} callback | |
| */ | |
| unskip_effect(effect2, callback = (e) => this.schedule(e)) { | |
| var tracked = this.#skipped_branches.get(effect2); | |
| if (tracked) { | |
| this.#skipped_branches.delete(effect2); | |
| for (var e of tracked.d) { | |
| set_signal_status(e, DIRTY); | |
| callback(e); | |
| } | |
| for (e of tracked.m) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| callback(e); | |
| } | |
| } | |
| this.#unskipped_branches.add(effect2); | |
| } | |
| #process() { | |
| this.#started = true; | |
| if (flush_count++ > 1e3) { | |
| this.#unlink(); | |
| infinite_loop_guard(); | |
| } | |
| if (!this.#is_deferred()) { | |
| for (const e of this.#dirty_effects) { | |
| this.#maybe_dirty_effects.delete(e); | |
| set_signal_status(e, DIRTY); | |
| this.schedule(e); | |
| } | |
| for (const e of this.#maybe_dirty_effects) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| this.schedule(e); | |
| } | |
| } | |
| const roots = this.#roots; | |
| this.#roots = []; | |
| this.apply(); | |
| var effects = collected_effects = []; | |
| var render_effects = []; | |
| var updates = legacy_updates = []; | |
| for (const root2 of roots) { | |
| try { | |
| this.#traverse(root2, effects, render_effects); | |
| } catch (e) { | |
| reset_all(root2); | |
| throw e; | |
| } | |
| } | |
| current_batch = null; | |
| if (updates.length > 0) { | |
| var batch = Batch.ensure(); | |
| for (const e of updates) { | |
| batch.schedule(e); | |
| } | |
| } | |
| collected_effects = null; | |
| legacy_updates = null; | |
| if (this.#is_deferred()) { | |
| this.#defer_effects(render_effects); | |
| this.#defer_effects(effects); | |
| for (const [e, t] of this.#skipped_branches) { | |
| reset_branch(e, t); | |
| } | |
| if (updates.length > 0) { | |
| /** @type {unknown} */ | |
| current_batch.#process(); | |
| } | |
| return; | |
| } | |
| const earlier_batch = this.#find_earlier_batch(); | |
| if (earlier_batch) { | |
| earlier_batch.#merge(this); | |
| return; | |
| } | |
| this.#dirty_effects.clear(); | |
| this.#maybe_dirty_effects.clear(); | |
| for (const fn of this.#commit_callbacks) fn(this); | |
| this.#commit_callbacks.clear(); | |
| previous_batch = this; | |
| flush_queued_effects(render_effects); | |
| flush_queued_effects(effects); | |
| previous_batch = null; | |
| this.#deferred?.resolve(); | |
| var next_batch = ( | |
| /** @type {Batch | null} */ | |
| /** @type {unknown} */ | |
| current_batch | |
| ); | |
| if (this.linked && this.#pending === 0) { | |
| this.#unlink(); | |
| } | |
| if (this.#roots.length > 0) { | |
| if (next_batch === null) { | |
| next_batch = this; | |
| this.#link(); | |
| } | |
| const batch2 = next_batch; | |
| batch2.#roots.push(...this.#roots.filter((r2) => !batch2.#roots.includes(r2))); | |
| } | |
| if (next_batch !== null) { | |
| next_batch.#process(); | |
| } | |
| } | |
| /** | |
| * Traverse the effect tree, executing effects or stashing | |
| * them for later execution as appropriate | |
| * @param {Effect} root | |
| * @param {Effect[]} effects | |
| * @param {Effect[]} render_effects | |
| */ | |
| #traverse(root2, effects, render_effects) { | |
| root2.f ^= CLEAN; | |
| var effect2 = root2.first; | |
| while (effect2 !== null) { | |
| var flags2 = effect2.f; | |
| var is_branch = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; | |
| var is_skippable_branch = is_branch && (flags2 & CLEAN) !== 0; | |
| var skip = is_skippable_branch || (flags2 & INERT) !== 0 || this.#skipped_branches.has(effect2); | |
| if (!skip && effect2.fn !== null) { | |
| if (is_branch) { | |
| effect2.f ^= CLEAN; | |
| } else if ((flags2 & EFFECT) !== 0) { | |
| effects.push(effect2); | |
| } else if (is_dirty(effect2)) { | |
| if ((flags2 & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect2); | |
| update_effect(effect2); | |
| } | |
| var child2 = effect2.first; | |
| if (child2 !== null) { | |
| effect2 = child2; | |
| continue; | |
| } | |
| } | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if (next2 !== null) { | |
| effect2 = next2; | |
| break; | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| } | |
| } | |
| #find_earlier_batch() { | |
| var batch = this.#prev; | |
| while (batch !== null) { | |
| if (!batch.is_fork) { | |
| for (const [value, [, is_derived]] of this.current) { | |
| if (batch.current.has(value) && !is_derived) { | |
| return batch; | |
| } | |
| } | |
| } | |
| batch = batch.#prev; | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #merge(batch) { | |
| for (const [source2, value] of batch.current) { | |
| if (!this.previous.has(source2) && batch.previous.has(source2)) { | |
| this.previous.set(source2, batch.previous.get(source2)); | |
| } | |
| this.current.set(source2, value); | |
| } | |
| for (const [effect2, deferred2] of batch.async_deriveds) { | |
| const d = this.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| const mark = (value) => { | |
| var reactions = value.reactions; | |
| if (reactions === null) return; | |
| for (const reaction of reactions) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| } else { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if (flags2 & (ASYNC | BLOCK_EFFECT) && !this.async_deriveds.has(effect2)) { | |
| this.#maybe_dirty_effects.delete(effect2); | |
| set_signal_status(effect2, DIRTY); | |
| this.schedule(effect2); | |
| } | |
| } | |
| } | |
| }; | |
| for (const source2 of this.current.keys()) { | |
| mark(source2); | |
| } | |
| this.oncommit(() => batch.discard()); | |
| batch.#unlink(); | |
| current_batch = this; | |
| this.#process(); | |
| } | |
| /** | |
| * @param {Effect[]} effects | |
| */ | |
| #defer_effects(effects) { | |
| for (var i = 0; i < effects.length; i += 1) { | |
| defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| } | |
| /** | |
| * Associate a change to a given source with the current | |
| * batch, noting its previous and current values | |
| * @param {Value} source | |
| * @param {any} value | |
| * @param {boolean} [is_derived] | |
| */ | |
| capture(source2, value, is_derived = false) { | |
| if (source2.v !== UNINITIALIZED && !this.previous.has(source2)) { | |
| this.previous.set(source2, source2.v); | |
| } | |
| if ((source2.f & ERROR_VALUE) === 0) { | |
| this.current.set(source2, [value, is_derived]); | |
| batch_values?.set(source2, value); | |
| } | |
| if (!this.is_fork) { | |
| source2.v = value; | |
| } | |
| } | |
| activate() { | |
| current_batch = this; | |
| } | |
| deactivate() { | |
| current_batch = null; | |
| batch_values = null; | |
| } | |
| flush() { | |
| try { | |
| if (DEV) ; | |
| is_processing = true; | |
| current_batch = this; | |
| this.#process(); | |
| } finally { | |
| flush_count = 0; | |
| last_scheduled_effect = null; | |
| collected_effects = null; | |
| legacy_updates = null; | |
| is_processing = false; | |
| current_batch = null; | |
| batch_values = null; | |
| old_values.clear(); | |
| } | |
| } | |
| discard() { | |
| for (const fn of this.#discard_callbacks) fn(this); | |
| this.#discard_callbacks.clear(); | |
| this.#fork_commit_callbacks.clear(); | |
| this.#unlink(); | |
| } | |
| /** | |
| * @param {Effect} effect | |
| */ | |
| register_created_effect(effect2) { | |
| this.#new_effects.push(effect2); | |
| } | |
| #commit() { | |
| this.#unlink(); | |
| for (let batch = first_batch; batch !== null; batch = batch.#next) { | |
| var is_earlier = batch.id < this.id; | |
| var sources = []; | |
| for (const [source3, [value, is_derived]] of this.current) { | |
| if (batch.current.has(source3)) { | |
| var batch_value = ( | |
| /** @type {[any, boolean]} */ | |
| batch.current.get(source3)[0] | |
| ); | |
| if (is_earlier && value !== batch_value) { | |
| batch.current.set(source3, [value, is_derived]); | |
| } else { | |
| continue; | |
| } | |
| } | |
| sources.push(source3); | |
| } | |
| if (is_earlier) { | |
| for (const [effect2, deferred2] of this.async_deriveds) { | |
| const d = batch.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| } | |
| if (!batch.#started) continue; | |
| var others = [...batch.current.keys()].filter((s) => !this.current.has(s)); | |
| if (others.length === 0) { | |
| if (is_earlier) { | |
| batch.discard(); | |
| } | |
| } else if (sources.length > 0) { | |
| if (is_earlier) { | |
| for (const unskipped of this.#unskipped_branches) { | |
| batch.unskip_effect(unskipped, (e) => { | |
| if ((e.f & (BLOCK_EFFECT | ASYNC)) !== 0) { | |
| batch.schedule(e); | |
| } else { | |
| batch.#defer_effects([e]); | |
| } | |
| }); | |
| } | |
| } | |
| batch.activate(); | |
| var marked = /* @__PURE__ */ new Set(); | |
| var checked = /* @__PURE__ */ new Map(); | |
| for (var source2 of sources) { | |
| mark_effects(source2, others, marked, checked); | |
| } | |
| checked = /* @__PURE__ */ new Map(); | |
| var current_unequal = [...batch.current.keys()].filter( | |
| (c) => this.current.has(c) ? ( | |
| /** @type {[any, boolean]} */ | |
| this.current.get(c)[0] !== c.v | |
| ) : true | |
| ); | |
| if (current_unequal.length > 0) { | |
| for (const effect2 of this.#new_effects) { | |
| if ((effect2.f & (DESTROYED | INERT | EAGER_EFFECT)) === 0 && depends_on(effect2, current_unequal, checked)) { | |
| if ((effect2.f & (ASYNC | BLOCK_EFFECT)) !== 0) { | |
| set_signal_status(effect2, DIRTY); | |
| batch.schedule(effect2); | |
| } else { | |
| batch.#dirty_effects.add(effect2); | |
| } | |
| } | |
| } | |
| } | |
| if (batch.#roots.length > 0) { | |
| batch.apply(); | |
| for (var root2 of batch.#roots) { | |
| batch.#traverse(root2, [], []); | |
| } | |
| batch.#roots = []; | |
| } | |
| batch.deactivate(); | |
| } | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| increment(blocking, effect2) { | |
| this.#pending += 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| this.#blocking_pending.set(effect2, blocking_pending_count + 1); | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| decrement(blocking, effect2) { | |
| this.#pending -= 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| if (blocking_pending_count === 1) { | |
| this.#blocking_pending.delete(effect2); | |
| } else { | |
| this.#blocking_pending.set(effect2, blocking_pending_count - 1); | |
| } | |
| } | |
| if (this.#decrement_queued) return; | |
| this.#decrement_queued = true; | |
| queue_micro_task(() => { | |
| this.#decrement_queued = false; | |
| if (this.linked) { | |
| this.flush(); | |
| } | |
| }); | |
| } | |
| /** | |
| * @param {Set<Effect>} dirty_effects | |
| * @param {Set<Effect>} maybe_dirty_effects | |
| */ | |
| transfer_effects(dirty_effects, maybe_dirty_effects) { | |
| for (const e of dirty_effects) { | |
| this.#dirty_effects.add(e); | |
| } | |
| for (const e of maybe_dirty_effects) { | |
| this.#maybe_dirty_effects.add(e); | |
| } | |
| dirty_effects.clear(); | |
| maybe_dirty_effects.clear(); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| oncommit(fn) { | |
| this.#commit_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| ondiscard(fn) { | |
| this.#discard_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| on_fork_commit(fn) { | |
| this.#fork_commit_callbacks.add(fn); | |
| } | |
| run_fork_commit_callbacks() { | |
| for (const fn of this.#fork_commit_callbacks) fn(this); | |
| this.#fork_commit_callbacks.clear(); | |
| } | |
| settled() { | |
| return (this.#deferred ??= deferred()).promise; | |
| } | |
| static ensure() { | |
| if (current_batch === null) { | |
| const batch = current_batch = new Batch(); | |
| batch.#link(); | |
| if (!is_processing && !is_flushing_sync) { | |
| queue_micro_task(() => { | |
| if (!batch.#started) { | |
| batch.flush(); | |
| } | |
| }); | |
| } | |
| } | |
| return current_batch; | |
| } | |
| apply() { | |
| { | |
| batch_values = null; | |
| return; | |
| } | |
| } | |
| /** | |
| * | |
| * @param {Effect} effect | |
| */ | |
| schedule(effect2) { | |
| last_scheduled_effect = effect2; | |
| if (effect2.b?.is_pending && (effect2.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 && (effect2.f & REACTION_RAN) === 0) { | |
| effect2.b.defer_effect(effect2); | |
| return; | |
| } | |
| var e = effect2; | |
| while (e.parent !== null) { | |
| e = e.parent; | |
| var flags2 = e.f; | |
| if (collected_effects !== null && e === active_effect) { | |
| if ((active_reaction === null || (active_reaction.f & DERIVED) === 0) && true) { | |
| return; | |
| } | |
| } | |
| if ((flags2 & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { | |
| if ((flags2 & CLEAN) === 0) { | |
| return; | |
| } | |
| e.f ^= CLEAN; | |
| } | |
| } | |
| this.#roots.push(e); | |
| } | |
| #link() { | |
| if (last_batch === null) { | |
| first_batch = last_batch = this; | |
| } else { | |
| last_batch.#next = this; | |
| this.#prev = last_batch; | |
| } | |
| last_batch = this; | |
| } | |
| #unlink() { | |
| var prev = this.#prev; | |
| var next2 = this.#next; | |
| if (prev === null) { | |
| first_batch = next2; | |
| } else { | |
| prev.#next = next2; | |
| } | |
| if (next2 === null) { | |
| last_batch = prev; | |
| } else { | |
| next2.#prev = prev; | |
| } | |
| this.linked = false; | |
| } | |
| } | |
| function flushSync(fn) { | |
| var was_flushing_sync = is_flushing_sync; | |
| is_flushing_sync = true; | |
| try { | |
| var result; | |
| if (fn) ; | |
| while (true) { | |
| flush_tasks(); | |
| if (current_batch === null) { | |
| return ( | |
| /** @type {T} */ | |
| result | |
| ); | |
| } | |
| current_batch.flush(); | |
| } | |
| } finally { | |
| is_flushing_sync = was_flushing_sync; | |
| } | |
| } | |
| function infinite_loop_guard() { | |
| try { | |
| effect_update_depth_exceeded(); | |
| } catch (error) { | |
| invoke_error_boundary(error, last_scheduled_effect); | |
| } | |
| } | |
| let eager_block_effects = null; | |
| function flush_queued_effects(effects) { | |
| var length = effects.length; | |
| if (length === 0) return; | |
| var i = 0; | |
| while (i < length) { | |
| var effect2 = effects[i++]; | |
| if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) { | |
| eager_block_effects = /* @__PURE__ */ new Set(); | |
| update_effect(effect2); | |
| if (effect2.deps === null && effect2.first === null && effect2.nodes === null && effect2.teardown === null && effect2.ac === null) { | |
| unlink_effect(effect2); | |
| } | |
| if (eager_block_effects?.size > 0) { | |
| old_values.clear(); | |
| for (const e of eager_block_effects) { | |
| if ((e.f & (DESTROYED | INERT)) !== 0) continue; | |
| const ordered_effects = [e]; | |
| let ancestor = e.parent; | |
| while (ancestor !== null) { | |
| if (eager_block_effects.has(ancestor)) { | |
| eager_block_effects.delete(ancestor); | |
| ordered_effects.push(ancestor); | |
| } | |
| ancestor = ancestor.parent; | |
| } | |
| for (let j = ordered_effects.length - 1; j >= 0; j--) { | |
| const e2 = ordered_effects[j]; | |
| if ((e2.f & (DESTROYED | INERT)) !== 0) continue; | |
| update_effect(e2); | |
| } | |
| } | |
| eager_block_effects.clear(); | |
| } | |
| } | |
| } | |
| eager_block_effects = null; | |
| } | |
| function mark_effects(value, sources, marked, checked) { | |
| if (marked.has(value)) return; | |
| marked.add(value); | |
| if (value.reactions !== null) { | |
| for (const reaction of value.reactions) { | |
| const flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark_effects( | |
| /** @type {Derived} */ | |
| reaction, | |
| sources, | |
| marked, | |
| checked | |
| ); | |
| } else if ((flags2 & (ASYNC | BLOCK_EFFECT)) !== 0 && (flags2 & DIRTY) === 0 && depends_on(reaction, sources, checked)) { | |
| set_signal_status(reaction, DIRTY); | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| function depends_on(reaction, sources, checked) { | |
| const depends = checked.get(reaction); | |
| if (depends !== void 0) return depends; | |
| if (reaction.deps !== null) { | |
| for (const dep of reaction.deps) { | |
| if (includes.call(sources, dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on( | |
| /** @type {Derived} */ | |
| dep, | |
| sources, | |
| checked | |
| )) { | |
| checked.set( | |
| /** @type {Derived} */ | |
| dep, | |
| true | |
| ); | |
| return true; | |
| } | |
| } | |
| } | |
| checked.set(reaction, false); | |
| return false; | |
| } | |
| function schedule_effect(effect2) { | |
| current_batch.schedule(effect2); | |
| } | |
| function reset_branch(effect2, tracked) { | |
| if ((effect2.f & BRANCH_EFFECT) !== 0 && (effect2.f & CLEAN) !== 0) { | |
| return; | |
| } | |
| if ((effect2.f & DIRTY) !== 0) { | |
| tracked.d.push(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| tracked.m.push(effect2); | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_branch(e, tracked); | |
| e = e.next; | |
| } | |
| } | |
| function reset_all(effect2) { | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_all(e); | |
| e = e.next; | |
| } | |
| } | |
| function createSubscriber(start) { | |
| let subscribers = 0; | |
| let version = source(0); | |
| let stop; | |
| return () => { | |
| if (effect_tracking()) { | |
| get(version); | |
| render_effect(() => { | |
| if (subscribers === 0) { | |
| stop = untrack(() => start(() => increment(version))); | |
| } | |
| subscribers += 1; | |
| return () => { | |
| queue_micro_task(() => { | |
| subscribers -= 1; | |
| if (subscribers === 0) { | |
| stop?.(); | |
| stop = void 0; | |
| increment(version); | |
| } | |
| }); | |
| }; | |
| }); | |
| } | |
| }; | |
| } | |
| var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED; | |
| function boundary(node, props, children, transform_error) { | |
| new Boundary(node, props, children, transform_error); | |
| } | |
| class Boundary { | |
| /** @type {Boundary | null} */ | |
| parent; | |
| is_pending = false; | |
| /** | |
| * API-level transformError transform function. Transforms errors before they reach the `failed` snippet. | |
| * Inherited from parent boundary, or defaults to identity. | |
| * @type {(error: unknown) => unknown} | |
| */ | |
| transform_error; | |
| /** @type {TemplateNode} */ | |
| #anchor; | |
| /** @type {TemplateNode | null} */ | |
| #hydrate_open = hydrating ? hydrate_node : null; | |
| /** @type {BoundaryProps} */ | |
| #props; | |
| /** @type {((anchor: Node) => void)} */ | |
| #children; | |
| /** @type {Effect} */ | |
| #effect; | |
| /** @type {Effect | null} */ | |
| #main_effect = null; | |
| /** @type {Effect | null} */ | |
| #pending_effect = null; | |
| /** @type {Effect | null} */ | |
| #failed_effect = null; | |
| /** @type {DocumentFragment | null} */ | |
| #offscreen_fragment = null; | |
| #local_pending_count = 0; | |
| #pending_count = 0; | |
| #pending_count_update_queued = false; | |
| /** @type {Set<Effect>} */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** @type {Set<Effect>} */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A source containing the number of pending async deriveds/expressions. | |
| * Only created if `$effect.pending()` is used inside the boundary, | |
| * otherwise updating the source results in needless `Batch.ensure()` | |
| * calls followed by no-op flushes | |
| * @type {Source<number> | null} | |
| */ | |
| #effect_pending = null; | |
| #effect_pending_subscriber = createSubscriber(() => { | |
| this.#effect_pending = source(this.#local_pending_count); | |
| return () => { | |
| this.#effect_pending = null; | |
| }; | |
| }); | |
| /** | |
| * @param {TemplateNode} node | |
| * @param {BoundaryProps} props | |
| * @param {((anchor: Node) => void)} children | |
| * @param {((error: unknown) => unknown) | undefined} [transform_error] | |
| */ | |
| constructor(node, props, children, transform_error) { | |
| this.#anchor = node; | |
| this.#props = props; | |
| this.#children = (anchor) => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| children(anchor); | |
| }; | |
| this.parent = /** @type {Effect} */ | |
| active_effect.b; | |
| this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e); | |
| this.#effect = block(() => { | |
| if (hydrating) { | |
| const comment2 = ( | |
| /** @type {Comment} */ | |
| this.#hydrate_open | |
| ); | |
| hydrate_next(); | |
| const server_rendered_pending = comment2.data === HYDRATION_START_ELSE; | |
| const server_rendered_failed = comment2.data.startsWith(HYDRATION_START_FAILED); | |
| if (server_rendered_failed) { | |
| const serialized_error = JSON.parse(comment2.data.slice(HYDRATION_START_FAILED.length)); | |
| this.#hydrate_failed_content(serialized_error); | |
| } else if (server_rendered_pending) { | |
| this.#hydrate_pending_content(); | |
| } else { | |
| this.#hydrate_resolved_content(); | |
| } | |
| } else { | |
| this.#render(); | |
| } | |
| }, flags); | |
| if (hydrating) { | |
| this.#anchor = hydrate_node; | |
| } | |
| } | |
| #hydrate_resolved_content() { | |
| try { | |
| this.#main_effect = branch(() => this.#children(this.#anchor)); | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error The deserialized error from the server's hydration comment | |
| */ | |
| #hydrate_failed_content(error) { | |
| const failed = this.#props.failed; | |
| if (!failed) return; | |
| this.#failed_effect = branch(() => { | |
| failed( | |
| this.#anchor, | |
| () => error, | |
| () => () => { | |
| } | |
| ); | |
| }); | |
| } | |
| #hydrate_pending_content() { | |
| const pending = this.#props.pending; | |
| if (!pending) return; | |
| this.is_pending = true; | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| queue_micro_task(() => { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| var anchor = create_text(); | |
| fragment.append(anchor); | |
| this.#main_effect = this.#run(() => { | |
| return branch(() => this.#children(anchor)); | |
| }); | |
| if (this.#pending_count === 0) { | |
| this.#anchor.before(fragment); | |
| this.#offscreen_fragment = null; | |
| pause_effect( | |
| /** @type {Effect} */ | |
| this.#pending_effect, | |
| () => { | |
| this.#pending_effect = null; | |
| } | |
| ); | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| }); | |
| } | |
| #render() { | |
| try { | |
| this.is_pending = this.has_pending_snippet(); | |
| this.#pending_count = 0; | |
| this.#local_pending_count = 0; | |
| this.#main_effect = branch(() => { | |
| this.#children(this.#anchor); | |
| }); | |
| if (this.#pending_count > 0) { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| move_effect(this.#main_effect, fragment); | |
| const pending = ( | |
| /** @type {(anchor: Node) => void} */ | |
| this.#props.pending | |
| ); | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| } else { | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #resolve(batch) { | |
| this.is_pending = false; | |
| batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Defer an effect inside a pending boundary until the boundary resolves | |
| * @param {Effect} effect | |
| */ | |
| defer_effect(effect2) { | |
| defer_effect(effect2, this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Returns `false` if the effect exists inside a boundary whose pending snippet is shown | |
| * @returns {boolean} | |
| */ | |
| is_rendered() { | |
| return !this.is_pending && (!this.parent || this.parent.is_rendered()); | |
| } | |
| has_pending_snippet() { | |
| return !!this.#props.pending; | |
| } | |
| /** | |
| * @template T | |
| * @param {() => T} fn | |
| */ | |
| #run(fn) { | |
| var previous_effect = active_effect; | |
| var previous_reaction = active_reaction; | |
| var previous_ctx = component_context; | |
| set_active_effect(this.#effect); | |
| set_active_reaction(this.#effect); | |
| set_component_context(this.#effect.ctx); | |
| try { | |
| Batch.ensure(); | |
| return fn(); | |
| } catch (e) { | |
| handle_error(e); | |
| return null; | |
| } finally { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_ctx); | |
| } | |
| } | |
| /** | |
| * Updates the pending count associated with the currently visible pending snippet, | |
| * if any, such that we can replace the snippet with content once work is done | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| #update_pending_count(d, batch) { | |
| if (!this.has_pending_snippet()) { | |
| if (this.parent) { | |
| this.parent.#update_pending_count(d, batch); | |
| } | |
| return; | |
| } | |
| this.#pending_count += d; | |
| if (this.#pending_count === 0) { | |
| this.#resolve(batch); | |
| if (this.#pending_effect) { | |
| pause_effect(this.#pending_effect, () => { | |
| this.#pending_effect = null; | |
| }); | |
| } | |
| if (this.#offscreen_fragment) { | |
| this.#anchor.before(this.#offscreen_fragment); | |
| this.#offscreen_fragment = null; | |
| } | |
| } | |
| } | |
| /** | |
| * Update the source that powers `$effect.pending()` inside this boundary, | |
| * and controls when the current `pending` snippet (if any) is removed. | |
| * Do not call from inside the class | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| update_pending_count(d, batch) { | |
| this.#update_pending_count(d, batch); | |
| this.#local_pending_count += d; | |
| if (!this.#effect_pending || this.#pending_count_update_queued) return; | |
| this.#pending_count_update_queued = true; | |
| queue_micro_task(() => { | |
| this.#pending_count_update_queued = false; | |
| if (this.#effect_pending) { | |
| internal_set(this.#effect_pending, this.#local_pending_count); | |
| } | |
| }); | |
| } | |
| get_effect_pending() { | |
| this.#effect_pending_subscriber(); | |
| return get( | |
| /** @type {Source<number>} */ | |
| this.#effect_pending | |
| ); | |
| } | |
| /** @param {unknown} error */ | |
| error(error) { | |
| if (!this.#props.onerror && !this.#props.failed) { | |
| throw error; | |
| } | |
| if (current_batch?.is_fork) { | |
| if (this.#main_effect) current_batch.skip_effect(this.#main_effect); | |
| if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect); | |
| if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect); | |
| current_batch.on_fork_commit(() => { | |
| this.#handle_error(error); | |
| }); | |
| } else { | |
| this.#handle_error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error | |
| */ | |
| #handle_error(error) { | |
| if (this.#main_effect) { | |
| destroy_effect(this.#main_effect); | |
| this.#main_effect = null; | |
| } | |
| if (this.#pending_effect) { | |
| destroy_effect(this.#pending_effect); | |
| this.#pending_effect = null; | |
| } | |
| if (this.#failed_effect) { | |
| destroy_effect(this.#failed_effect); | |
| this.#failed_effect = null; | |
| } | |
| if (hydrating) { | |
| set_hydrate_node( | |
| /** @type {TemplateNode} */ | |
| this.#hydrate_open | |
| ); | |
| next(); | |
| set_hydrate_node(skip_nodes()); | |
| } | |
| var onerror = this.#props.onerror; | |
| let failed = this.#props.failed; | |
| var did_reset = false; | |
| var calling_on_error = false; | |
| const reset2 = () => { | |
| if (did_reset) { | |
| svelte_boundary_reset_noop(); | |
| return; | |
| } | |
| did_reset = true; | |
| if (calling_on_error) { | |
| svelte_boundary_reset_onerror(); | |
| } | |
| if (this.#failed_effect !== null) { | |
| pause_effect(this.#failed_effect, () => { | |
| this.#failed_effect = null; | |
| }); | |
| } | |
| this.#run(() => { | |
| this.#render(); | |
| }); | |
| }; | |
| const handle_error_result = (transformed_error) => { | |
| try { | |
| calling_on_error = true; | |
| onerror?.(transformed_error, reset2); | |
| calling_on_error = false; | |
| } catch (error2) { | |
| invoke_error_boundary(error2, this.#effect && this.#effect.parent); | |
| } | |
| if (failed) { | |
| this.#failed_effect = this.#run(() => { | |
| try { | |
| return branch(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| failed( | |
| this.#anchor, | |
| () => transformed_error, | |
| () => reset2 | |
| ); | |
| }); | |
| } catch (error2) { | |
| invoke_error_boundary( | |
| error2, | |
| /** @type {Effect} */ | |
| this.#effect.parent | |
| ); | |
| return null; | |
| } | |
| }); | |
| } | |
| }; | |
| queue_micro_task(() => { | |
| var result; | |
| try { | |
| result = this.transform_error(error); | |
| } catch (e) { | |
| invoke_error_boundary(e, this.#effect && this.#effect.parent); | |
| return; | |
| } | |
| if (result !== null && typeof result === "object" && typeof /** @type {any} */ | |
| result.then === "function") { | |
| result.then( | |
| handle_error_result, | |
| /** @param {unknown} e */ | |
| (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent) | |
| ); | |
| } else { | |
| handle_error_result(result); | |
| } | |
| }); | |
| } | |
| } | |
| function flatten(blockers, sync, async, fn) { | |
| const d = derived; | |
| var pending = blockers.filter((b) => !b.settled); | |
| if (async.length === 0 && pending.length === 0) { | |
| fn(sync.map(d)); | |
| return; | |
| } | |
| var parent = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var restore = capture(); | |
| var blocker_promise = pending.length === 1 ? pending[0].promise : pending.length > 1 ? Promise.all(pending.map((b) => b.promise)) : null; | |
| function finish(values) { | |
| if ((parent.f & DESTROYED) !== 0) { | |
| return; | |
| } | |
| restore(); | |
| try { | |
| fn(values); | |
| } catch (error) { | |
| invoke_error_boundary(error, parent); | |
| } | |
| unset_context(); | |
| } | |
| var decrement_pending = increment_pending(); | |
| if (async.length === 0) { | |
| blocker_promise.then(() => finish(sync.map(d))).finally(decrement_pending); | |
| return; | |
| } | |
| function run() { | |
| Promise.all(async.map((expression) => /* @__PURE__ */ async_derived(expression))).then((result) => finish([...sync.map(d), ...result])).catch((error) => invoke_error_boundary(error, parent)).finally(decrement_pending); | |
| } | |
| if (blocker_promise) { | |
| blocker_promise.then(() => { | |
| restore(); | |
| run(); | |
| unset_context(); | |
| }); | |
| } else { | |
| run(); | |
| } | |
| } | |
| function capture() { | |
| var previous_effect = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var previous_reaction = active_reaction; | |
| var previous_component_context = component_context; | |
| var previous_batch2 = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| return function restore(activate_batch = true) { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_component_context); | |
| if (activate_batch && (previous_effect.f & DESTROYED) === 0) { | |
| previous_batch2?.activate(); | |
| previous_batch2?.apply(); | |
| } | |
| }; | |
| } | |
| function unset_context(deactivate_batch = true) { | |
| set_active_effect(null); | |
| set_active_reaction(null); | |
| set_component_context(null); | |
| if (deactivate_batch) current_batch?.deactivate(); | |
| } | |
| function increment_pending() { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var boundary2 = ( | |
| /** @type {Boundary} */ | |
| effect2.b | |
| ); | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| var blocking = boundary2.is_rendered(); | |
| boundary2.update_pending_count(1, batch); | |
| batch.increment(blocking, effect2); | |
| return () => { | |
| boundary2.update_pending_count(-1, batch); | |
| batch.decrement(blocking, effect2); | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function derived(fn) { | |
| var flags2 = DERIVED | DIRTY; | |
| if (active_effect !== null) { | |
| active_effect.f |= EFFECT_PRESERVED; | |
| } | |
| const signal = { | |
| ctx: component_context, | |
| deps: null, | |
| effects: null, | |
| equals, | |
| f: flags2, | |
| fn, | |
| reactions: null, | |
| rv: 0, | |
| v: ( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ), | |
| wv: 0, | |
| parent: active_effect, | |
| ac: null | |
| }; | |
| return signal; | |
| } | |
| const OBSOLETE = /* @__PURE__ */ Symbol("obsolete"); | |
| // @__NO_SIDE_EFFECTS__ | |
| function async_derived(fn, label, location2) { | |
| let parent = ( | |
| /** @type {Effect | null} */ | |
| active_effect | |
| ); | |
| if (parent === null) { | |
| async_derived_orphan(); | |
| } | |
| var promise = ( | |
| /** @type {Promise<V>} */ | |
| /** @type {unknown} */ | |
| void 0 | |
| ); | |
| var signal = source( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ); | |
| var should_suspend = !active_reaction; | |
| var deferreds = /* @__PURE__ */ new Set(); | |
| async_effect(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var d = deferred(); | |
| promise = d.promise; | |
| try { | |
| Promise.resolve(fn()).then(d.resolve, (e) => { | |
| if (e !== STALE_REACTION) d.reject(e); | |
| }).finally(unset_context); | |
| } catch (error) { | |
| d.reject(error); | |
| unset_context(); | |
| } | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| if (should_suspend) { | |
| if ((effect2.f & REACTION_RAN) !== 0) { | |
| var decrement_pending = increment_pending(); | |
| } | |
| if ( | |
| /** @type {Boundary} */ | |
| parent.b.is_rendered() | |
| ) { | |
| batch.async_deriveds.get(effect2)?.reject(OBSOLETE); | |
| } else { | |
| for (const d2 of deferreds.values()) { | |
| d2.reject(OBSOLETE); | |
| } | |
| } | |
| deferreds.add(d); | |
| batch.async_deriveds.set(effect2, d); | |
| } | |
| const handler = (value, error = void 0) => { | |
| decrement_pending?.(); | |
| deferreds.delete(d); | |
| if (error === OBSOLETE) return; | |
| batch.activate(); | |
| if (error) { | |
| signal.f |= ERROR_VALUE; | |
| internal_set(signal, error); | |
| } else { | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| signal.f ^= ERROR_VALUE; | |
| } | |
| internal_set(signal, value); | |
| } | |
| batch.deactivate(); | |
| }; | |
| d.promise.then(handler, (e) => handler(null, e || "unknown")); | |
| }); | |
| teardown(() => { | |
| for (const d of deferreds) { | |
| d.reject(OBSOLETE); | |
| } | |
| }); | |
| return new Promise((fulfil) => { | |
| function next2(p) { | |
| function go() { | |
| if (p === promise) { | |
| fulfil(signal); | |
| } else { | |
| next2(promise); | |
| } | |
| } | |
| p.then(go, go); | |
| } | |
| next2(promise); | |
| }); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function user_derived(fn) { | |
| const d = /* @__PURE__ */ derived(fn); | |
| push_reaction_value(d); | |
| return d; | |
| } | |
| function destroy_derived_effects(derived2) { | |
| var effects = derived2.effects; | |
| if (effects !== null) { | |
| derived2.effects = null; | |
| for (var i = 0; i < effects.length; i += 1) { | |
| destroy_effect( | |
| /** @type {Effect} */ | |
| effects[i] | |
| ); | |
| } | |
| } | |
| } | |
| function execute_derived(derived2) { | |
| var value; | |
| var prev_active_effect = active_effect; | |
| var parent = derived2.parent; | |
| if (!is_destroying_effect && parent !== null && derived2.v !== UNINITIALIZED && // if it was never evaluated before, it's guaranteed to fail downstream, so we try to execute instead | |
| (parent.f & (DESTROYED | INERT)) !== 0) { | |
| derived_inert(); | |
| return derived2.v; | |
| } | |
| set_active_effect(parent); | |
| { | |
| try { | |
| derived2.f &= ~WAS_MARKED; | |
| destroy_derived_effects(derived2); | |
| value = update_reaction(derived2); | |
| } finally { | |
| set_active_effect(prev_active_effect); | |
| } | |
| } | |
| return value; | |
| } | |
| function update_derived(derived2) { | |
| var value = execute_derived(derived2); | |
| if (!derived2.equals(value)) { | |
| derived2.wv = increment_write_version(); | |
| if (!current_batch?.is_fork || derived2.deps === null) { | |
| if (current_batch !== null) { | |
| current_batch.capture(derived2, value, true); | |
| previous_batch?.capture(derived2, value, true); | |
| } else { | |
| derived2.v = value; | |
| } | |
| if (derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| return; | |
| } | |
| } | |
| } | |
| if (is_destroying_effect) { | |
| return; | |
| } | |
| if (batch_values !== null) { | |
| if (effect_tracking() || current_batch?.is_fork) { | |
| batch_values.set(derived2, value); | |
| } | |
| } else { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| function freeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown || e.ac) { | |
| e.teardown?.(); | |
| e.ac?.abort(STALE_REACTION); | |
| if (e.fn !== null) e.teardown = noop; | |
| e.ac = null; | |
| remove_reactions(e, 0); | |
| destroy_effect_children(e); | |
| } | |
| } | |
| } | |
| function unfreeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown && e.fn !== null) { | |
| update_effect(e); | |
| } | |
| } | |
| } | |
| let eager_effects = /* @__PURE__ */ new Set(); | |
| const old_values = /* @__PURE__ */ new Map(); | |
| let eager_effects_deferred = false; | |
| function source(v, stack) { | |
| var signal = { | |
| f: 0, | |
| // TODO ideally we could skip this altogether, but it causes type errors | |
| v, | |
| reactions: null, | |
| equals, | |
| rv: 0, | |
| wv: 0 | |
| }; | |
| return signal; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function state(v, stack) { | |
| const s = source(v); | |
| push_reaction_value(s); | |
| return s; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function mutable_source(initial_value, immutable = false, trackable = true) { | |
| const s = source(initial_value); | |
| if (!immutable) { | |
| s.equals = safe_equals; | |
| } | |
| return s; | |
| } | |
| function set(source2, value, should_proxy = false) { | |
| if (active_reaction !== null && // since we are untracking the function inside `$inspect.with` we need to add this check | |
| // to ensure we error if state is set inside an inspect effect | |
| (!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 && (current_sources === null || !includes.call(current_sources, source2))) { | |
| state_unsafe_mutation(); | |
| } | |
| let new_value = should_proxy ? proxy(value) : value; | |
| return internal_set(source2, new_value, legacy_updates); | |
| } | |
| function internal_set(source2, value, updated_during_traversal = null) { | |
| if (!source2.equals(value)) { | |
| old_values.set(source2, is_destroying_effect ? value : source2.v); | |
| var batch = Batch.ensure(); | |
| batch.capture(source2, value); | |
| if ((source2.f & DERIVED) !== 0) { | |
| const derived2 = ( | |
| /** @type {Derived} */ | |
| source2 | |
| ); | |
| if ((source2.f & DIRTY) !== 0) { | |
| execute_derived(derived2); | |
| } | |
| if (batch_values === null) { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| source2.wv = increment_write_version(); | |
| mark_reactions(source2, DIRTY, updated_during_traversal); | |
| if (active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { | |
| if (untracked_writes === null) { | |
| set_untracked_writes([source2]); | |
| } else { | |
| untracked_writes.push(source2); | |
| } | |
| } | |
| if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) { | |
| flush_eager_effects(); | |
| } | |
| } | |
| return value; | |
| } | |
| function flush_eager_effects() { | |
| eager_effects_deferred = false; | |
| for (const effect2 of eager_effects) { | |
| if ((effect2.f & CLEAN) !== 0) { | |
| set_signal_status(effect2, MAYBE_DIRTY); | |
| } | |
| let dirty; | |
| try { | |
| dirty = is_dirty(effect2); | |
| } catch { | |
| dirty = true; | |
| } | |
| if (dirty) { | |
| update_effect(effect2); | |
| } | |
| } | |
| eager_effects.clear(); | |
| } | |
| function increment(source2) { | |
| set(source2, source2.v + 1); | |
| } | |
| function mark_reactions(signal, status, updated_during_traversal) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| var length = reactions.length; | |
| for (var i = 0; i < length; i++) { | |
| var reaction = reactions[i]; | |
| var flags2 = reaction.f; | |
| var not_dirty = (flags2 & DIRTY) === 0; | |
| if (not_dirty) { | |
| set_signal_status(reaction, status); | |
| } | |
| if ((flags2 & EAGER_EFFECT) !== 0) { | |
| eager_effects.add( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } else if ((flags2 & DERIVED) !== 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| batch_values?.delete(derived2); | |
| if ((flags2 & WAS_MARKED) === 0) { | |
| if (flags2 & CONNECTED && (active_effect === null || (active_effect.f & REACTION_IS_UPDATING) === 0)) { | |
| reaction.f |= WAS_MARKED; | |
| } | |
| mark_reactions(derived2, MAYBE_DIRTY, updated_during_traversal); | |
| } | |
| } else if (not_dirty) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if ((flags2 & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) { | |
| eager_block_effects.add(effect2); | |
| } | |
| if (updated_during_traversal !== null) { | |
| updated_during_traversal.push(effect2); | |
| } else { | |
| schedule_effect(effect2); | |
| } | |
| } | |
| } | |
| } | |
| function autofocus(dom, value) { | |
| if (value) { | |
| const body = document.body; | |
| dom.autofocus = true; | |
| queue_micro_task(() => { | |
| if (document.activeElement === body) { | |
| dom.focus(); | |
| } | |
| }); | |
| } | |
| } | |
| let listening_to_form_reset = false; | |
| function add_form_reset_listener() { | |
| if (!listening_to_form_reset) { | |
| listening_to_form_reset = true; | |
| document.addEventListener( | |
| "reset", | |
| (evt) => { | |
| Promise.resolve().then(() => { | |
| if (!evt.defaultPrevented) { | |
| for ( | |
| const e of | |
| /**@type {HTMLFormElement} */ | |
| evt.target.elements | |
| ) { | |
| e[FORM_RESET_HANDLER]?.(); | |
| } | |
| } | |
| }); | |
| }, | |
| // In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation) | |
| { capture: true } | |
| ); | |
| } | |
| } | |
| function without_reactive_context(fn) { | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| return fn(); | |
| } finally { | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| function listen_to_event_and_reset_event(element, event2, handler, on_reset = handler) { | |
| element.addEventListener(event2, () => without_reactive_context(handler)); | |
| const prev = ( | |
| /** @type {any} */ | |
| element[FORM_RESET_HANDLER] | |
| ); | |
| if (prev) { | |
| element[FORM_RESET_HANDLER] = () => { | |
| prev(); | |
| on_reset(true); | |
| }; | |
| } else { | |
| element[FORM_RESET_HANDLER] = () => on_reset(true); | |
| } | |
| add_form_reset_listener(); | |
| } | |
| let is_updating_effect = false; | |
| let is_destroying_effect = false; | |
| function set_is_destroying_effect(value) { | |
| is_destroying_effect = value; | |
| } | |
| let active_reaction = null; | |
| let untracking = false; | |
| function set_active_reaction(reaction) { | |
| active_reaction = reaction; | |
| } | |
| let active_effect = null; | |
| function set_active_effect(effect2) { | |
| active_effect = effect2; | |
| } | |
| let current_sources = null; | |
| function push_reaction_value(value) { | |
| if (active_reaction !== null && true) { | |
| if (current_sources === null) { | |
| current_sources = [value]; | |
| } else { | |
| current_sources.push(value); | |
| } | |
| } | |
| } | |
| let new_deps = null; | |
| let skipped_deps = 0; | |
| let untracked_writes = null; | |
| function set_untracked_writes(value) { | |
| untracked_writes = value; | |
| } | |
| let write_version = 1; | |
| let read_version = 0; | |
| let update_version = read_version; | |
| function set_update_version(value) { | |
| update_version = value; | |
| } | |
| function increment_write_version() { | |
| return ++write_version; | |
| } | |
| function is_dirty(reaction) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DIRTY) !== 0) { | |
| return true; | |
| } | |
| if (flags2 & DERIVED) { | |
| reaction.f &= ~WAS_MARKED; | |
| } | |
| if ((flags2 & MAYBE_DIRTY) !== 0) { | |
| var dependencies = ( | |
| /** @type {Value[]} */ | |
| reaction.deps | |
| ); | |
| var length = dependencies.length; | |
| for (var i = 0; i < length; i++) { | |
| var dependency = dependencies[i]; | |
| if (is_dirty( | |
| /** @type {Derived} */ | |
| dependency | |
| )) { | |
| update_derived( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| } | |
| if (dependency.wv > reaction.wv) { | |
| return true; | |
| } | |
| } | |
| if ((flags2 & CONNECTED) !== 0 && // During time traveling we don't want to reset the status so that | |
| // traversal of the graph in the other batches still happens | |
| batch_values === null) { | |
| set_signal_status(reaction, CLEAN); | |
| } | |
| } | |
| return false; | |
| } | |
| function schedule_possible_effect_self_invalidation(signal, effect2, root2 = true) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| if (current_sources !== null && includes.call(current_sources, signal)) { | |
| return; | |
| } | |
| for (var i = 0; i < reactions.length; i++) { | |
| var reaction = reactions[i]; | |
| if ((reaction.f & DERIVED) !== 0) { | |
| schedule_possible_effect_self_invalidation( | |
| /** @type {Derived} */ | |
| reaction, | |
| effect2, | |
| false | |
| ); | |
| } else if (effect2 === reaction) { | |
| if (root2) { | |
| set_signal_status(reaction, DIRTY); | |
| } else if ((reaction.f & CLEAN) !== 0) { | |
| set_signal_status(reaction, MAYBE_DIRTY); | |
| } | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| function update_reaction(reaction) { | |
| var previous_deps = new_deps; | |
| var previous_skipped_deps = skipped_deps; | |
| var previous_untracked_writes = untracked_writes; | |
| var previous_reaction = active_reaction; | |
| var previous_sources = current_sources; | |
| var previous_component_context = component_context; | |
| var previous_untracking = untracking; | |
| var previous_update_version = update_version; | |
| var flags2 = reaction.f; | |
| new_deps = /** @type {null | Value[]} */ | |
| null; | |
| skipped_deps = 0; | |
| untracked_writes = null; | |
| active_reaction = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; | |
| current_sources = null; | |
| set_component_context(reaction.ctx); | |
| untracking = false; | |
| update_version = ++read_version; | |
| if (reaction.ac !== null) { | |
| without_reactive_context(() => { | |
| reaction.ac.abort(STALE_REACTION); | |
| }); | |
| reaction.ac = null; | |
| } | |
| try { | |
| reaction.f |= REACTION_IS_UPDATING; | |
| var fn = ( | |
| /** @type {Function} */ | |
| reaction.fn | |
| ); | |
| var result = fn(); | |
| reaction.f |= REACTION_RAN; | |
| var deps = reaction.deps; | |
| var is_fork = current_batch?.is_fork; | |
| if (new_deps !== null) { | |
| var i; | |
| if (!is_fork) { | |
| remove_reactions(reaction, skipped_deps); | |
| } | |
| if (deps !== null && skipped_deps > 0) { | |
| deps.length = skipped_deps + new_deps.length; | |
| for (i = 0; i < new_deps.length; i++) { | |
| deps[skipped_deps + i] = new_deps[i]; | |
| } | |
| } else { | |
| reaction.deps = deps = new_deps; | |
| } | |
| if (effect_tracking() && (reaction.f & CONNECTED) !== 0) { | |
| for (i = skipped_deps; i < deps.length; i++) { | |
| (deps[i].reactions ??= []).push(reaction); | |
| } | |
| } | |
| } else if (!is_fork && deps !== null && skipped_deps < deps.length) { | |
| remove_reactions(reaction, skipped_deps); | |
| deps.length = skipped_deps; | |
| } | |
| if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0) { | |
| for (i = 0; i < /** @type {Source[]} */ | |
| untracked_writes.length; i++) { | |
| schedule_possible_effect_self_invalidation( | |
| untracked_writes[i], | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| if (previous_reaction !== null && previous_reaction !== reaction) { | |
| read_version++; | |
| if (previous_reaction.deps !== null) { | |
| for (let i2 = 0; i2 < previous_skipped_deps; i2 += 1) { | |
| previous_reaction.deps[i2].rv = read_version; | |
| } | |
| } | |
| if (previous_deps !== null) { | |
| for (const dep of previous_deps) { | |
| dep.rv = read_version; | |
| } | |
| } | |
| if (untracked_writes !== null) { | |
| if (previous_untracked_writes === null) { | |
| previous_untracked_writes = untracked_writes; | |
| } else { | |
| previous_untracked_writes.push(.../** @type {Source[]} */ | |
| untracked_writes); | |
| } | |
| } | |
| } | |
| if ((reaction.f & ERROR_VALUE) !== 0) { | |
| reaction.f ^= ERROR_VALUE; | |
| } | |
| return result; | |
| } catch (error) { | |
| return handle_error(error); | |
| } finally { | |
| reaction.f ^= REACTION_IS_UPDATING; | |
| new_deps = previous_deps; | |
| skipped_deps = previous_skipped_deps; | |
| untracked_writes = previous_untracked_writes; | |
| active_reaction = previous_reaction; | |
| current_sources = previous_sources; | |
| set_component_context(previous_component_context); | |
| untracking = previous_untracking; | |
| update_version = previous_update_version; | |
| } | |
| } | |
| function remove_reaction(signal, dependency) { | |
| let reactions = dependency.reactions; | |
| if (reactions !== null) { | |
| var index = index_of.call(reactions, signal); | |
| if (index !== -1) { | |
| var new_length = reactions.length - 1; | |
| if (new_length === 0) { | |
| reactions = dependency.reactions = null; | |
| } else { | |
| reactions[index] = reactions[new_length]; | |
| reactions.pop(); | |
| } | |
| } | |
| } | |
| if (reactions === null && (dependency.f & DERIVED) !== 0 && // Destroying a child effect while updating a parent effect can cause a dependency to appear | |
| // to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps` | |
| // allows us to skip the expensive work of disconnecting and immediately reconnecting it | |
| (new_deps === null || !includes.call(new_deps, dependency))) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| if ((derived2.f & CONNECTED) !== 0) { | |
| derived2.f ^= CONNECTED; | |
| derived2.f &= ~WAS_MARKED; | |
| } | |
| if (derived2.v !== UNINITIALIZED) { | |
| update_derived_status(derived2); | |
| } | |
| freeze_derived_effects(derived2); | |
| remove_reactions(derived2, 0); | |
| } | |
| } | |
| function remove_reactions(signal, start_index) { | |
| var dependencies = signal.deps; | |
| if (dependencies === null) return; | |
| for (var i = start_index; i < dependencies.length; i++) { | |
| remove_reaction(signal, dependencies[i]); | |
| } | |
| } | |
| function update_effect(effect2) { | |
| var flags2 = effect2.f; | |
| if ((flags2 & DESTROYED) !== 0) { | |
| return; | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var previous_effect = active_effect; | |
| var was_updating_effect = is_updating_effect; | |
| active_effect = effect2; | |
| is_updating_effect = true; | |
| try { | |
| if ((flags2 & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) { | |
| destroy_block_effect_children(effect2); | |
| } else { | |
| destroy_effect_children(effect2); | |
| } | |
| execute_effect_teardown(effect2); | |
| var teardown2 = update_reaction(effect2); | |
| effect2.teardown = typeof teardown2 === "function" ? teardown2 : null; | |
| effect2.wv = write_version; | |
| var dep; | |
| if (DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) ; | |
| } finally { | |
| is_updating_effect = was_updating_effect; | |
| active_effect = previous_effect; | |
| } | |
| } | |
| async function tick() { | |
| await Promise.resolve(); | |
| flushSync(); | |
| } | |
| function get(signal) { | |
| var flags2 = signal.f; | |
| var is_derived = (flags2 & DERIVED) !== 0; | |
| if (active_reaction !== null && !untracking) { | |
| var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0; | |
| if (!destroyed && (current_sources === null || !includes.call(current_sources, signal))) { | |
| var deps = active_reaction.deps; | |
| if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { | |
| if (signal.rv < read_version) { | |
| signal.rv = read_version; | |
| if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { | |
| skipped_deps++; | |
| } else if (new_deps === null) { | |
| new_deps = [signal]; | |
| } else { | |
| new_deps.push(signal); | |
| } | |
| } | |
| } else { | |
| (active_reaction.deps ??= []).push(signal); | |
| var reactions = signal.reactions; | |
| if (reactions === null) { | |
| signal.reactions = [active_reaction]; | |
| } else if (!includes.call(reactions, active_reaction)) { | |
| reactions.push(active_reaction); | |
| } | |
| } | |
| } | |
| } | |
| if (is_destroying_effect && old_values.has(signal)) { | |
| return old_values.get(signal); | |
| } | |
| if (is_derived) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| signal | |
| ); | |
| if (is_destroying_effect) { | |
| var value = derived2.v; | |
| if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) { | |
| value = execute_derived(derived2); | |
| } | |
| old_values.set(derived2, value); | |
| return value; | |
| } | |
| var should_connect = (derived2.f & CONNECTED) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & CONNECTED) !== 0); | |
| var is_new = (derived2.f & REACTION_RAN) === 0; | |
| if (is_dirty(derived2)) { | |
| if (should_connect) { | |
| derived2.f |= CONNECTED; | |
| } | |
| update_derived(derived2); | |
| } | |
| if (should_connect && !is_new) { | |
| unfreeze_derived_effects(derived2); | |
| reconnect(derived2); | |
| } | |
| } | |
| if (batch_values?.has(signal)) { | |
| return batch_values.get(signal); | |
| } | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| throw signal.v; | |
| } | |
| return signal.v; | |
| } | |
| function reconnect(derived2) { | |
| derived2.f |= CONNECTED; | |
| if (derived2.deps === null) return; | |
| for (const dep of derived2.deps) { | |
| (dep.reactions ??= []).push(derived2); | |
| if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) { | |
| unfreeze_derived_effects( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| reconnect( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| } | |
| } | |
| } | |
| function depends_on_old_values(derived2) { | |
| if (derived2.v === UNINITIALIZED) return true; | |
| if (derived2.deps === null) return false; | |
| for (const dep of derived2.deps) { | |
| if (old_values.has(dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on_old_values( | |
| /** @type {Derived} */ | |
| dep | |
| )) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function validate_effect(rune) { | |
| if (active_effect === null) { | |
| if (active_reaction === null) { | |
| effect_orphan(); | |
| } | |
| effect_in_unowned_derived(); | |
| } | |
| if (is_destroying_effect) { | |
| effect_in_teardown(); | |
| } | |
| } | |
| function push_effect(effect2, parent_effect) { | |
| var parent_last = parent_effect.last; | |
| if (parent_last === null) { | |
| parent_effect.last = parent_effect.first = effect2; | |
| } else { | |
| parent_last.next = effect2; | |
| effect2.prev = parent_last; | |
| parent_effect.last = effect2; | |
| } | |
| } | |
| function create_effect(type, fn) { | |
| var parent = active_effect; | |
| if (parent !== null && (parent.f & INERT) !== 0) { | |
| type |= INERT; | |
| } | |
| var effect2 = { | |
| ctx: component_context, | |
| deps: null, | |
| nodes: null, | |
| f: type | DIRTY | CONNECTED, | |
| first: null, | |
| fn, | |
| last: null, | |
| next: null, | |
| parent, | |
| b: parent && parent.b, | |
| prev: null, | |
| teardown: null, | |
| wv: 0, | |
| ac: null | |
| }; | |
| current_batch?.register_created_effect(effect2); | |
| var e = effect2; | |
| if ((type & EFFECT) !== 0) { | |
| if (collected_effects !== null) { | |
| collected_effects.push(effect2); | |
| } else { | |
| Batch.ensure().schedule(effect2); | |
| } | |
| } else if (fn !== null) { | |
| try { | |
| update_effect(effect2); | |
| } catch (e2) { | |
| destroy_effect(effect2); | |
| throw e2; | |
| } | |
| if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && // either `null`, or a singular child | |
| (e.f & EFFECT_PRESERVED) === 0) { | |
| e = e.first; | |
| if ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) { | |
| e.f |= EFFECT_TRANSPARENT; | |
| } | |
| } | |
| } | |
| if (e !== null) { | |
| e.parent = parent; | |
| if (parent !== null) { | |
| push_effect(e, parent); | |
| } | |
| if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| active_reaction | |
| ); | |
| (derived2.effects ??= []).push(e); | |
| } | |
| } | |
| return effect2; | |
| } | |
| function effect_tracking() { | |
| return active_reaction !== null && !untracking; | |
| } | |
| function teardown(fn) { | |
| const effect2 = create_effect(RENDER_EFFECT, null); | |
| set_signal_status(effect2, CLEAN); | |
| effect2.teardown = fn; | |
| return effect2; | |
| } | |
| function user_effect(fn) { | |
| validate_effect(); | |
| var flags2 = ( | |
| /** @type {Effect} */ | |
| active_effect.f | |
| ); | |
| var defer = !active_reaction && (flags2 & BRANCH_EFFECT) !== 0 && (flags2 & REACTION_RAN) === 0; | |
| if (defer) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| (context.e ??= []).push(fn); | |
| } else { | |
| return create_user_effect(fn); | |
| } | |
| } | |
| function create_user_effect(fn) { | |
| return create_effect(EFFECT | USER_EFFECT, fn); | |
| } | |
| function effect_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return () => { | |
| destroy_effect(effect2); | |
| }; | |
| } | |
| function component_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return (options = {}) => { | |
| return new Promise((fulfil) => { | |
| if (options.outro) { | |
| pause_effect(effect2, () => { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| }); | |
| } else { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| } | |
| }); | |
| }; | |
| } | |
| function effect(fn) { | |
| return create_effect(EFFECT, fn); | |
| } | |
| function async_effect(fn) { | |
| return create_effect(ASYNC | EFFECT_PRESERVED, fn); | |
| } | |
| function render_effect(fn, flags2 = 0) { | |
| return create_effect(RENDER_EFFECT | flags2, fn); | |
| } | |
| function template_effect(fn, sync = [], async = [], blockers = []) { | |
| flatten(blockers, sync, async, (values) => { | |
| create_effect(RENDER_EFFECT, () => fn(...values.map(get))); | |
| }); | |
| } | |
| function block(fn, flags2 = 0) { | |
| var effect2 = create_effect(BLOCK_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function managed(fn, flags2 = 0) { | |
| var effect2 = create_effect(MANAGED_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function branch(fn) { | |
| return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn); | |
| } | |
| function execute_effect_teardown(effect2) { | |
| var teardown2 = effect2.teardown; | |
| if (teardown2 !== null) { | |
| const previously_destroying_effect = is_destroying_effect; | |
| const previous_reaction = active_reaction; | |
| set_is_destroying_effect(true); | |
| set_active_reaction(null); | |
| try { | |
| teardown2.call(null); | |
| } finally { | |
| set_is_destroying_effect(previously_destroying_effect); | |
| set_active_reaction(previous_reaction); | |
| } | |
| } | |
| } | |
| function destroy_effect_children(signal, remove_dom = false) { | |
| var effect2 = signal.first; | |
| signal.first = signal.last = null; | |
| while (effect2 !== null) { | |
| const controller = effect2.ac; | |
| if (controller !== null) { | |
| without_reactive_context(() => { | |
| controller.abort(STALE_REACTION); | |
| }); | |
| } | |
| var next2 = effect2.next; | |
| if ((effect2.f & ROOT_EFFECT) !== 0) { | |
| effect2.parent = null; | |
| } else { | |
| destroy_effect(effect2, remove_dom); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_block_effect_children(signal) { | |
| var effect2 = signal.first; | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if ((effect2.f & BRANCH_EFFECT) === 0) { | |
| destroy_effect(effect2); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_effect(effect2, remove_dom = true) { | |
| var removed = false; | |
| if ((remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes !== null && effect2.nodes.end !== null) { | |
| remove_effect_dom( | |
| effect2.nodes.start, | |
| /** @type {TemplateNode} */ | |
| effect2.nodes.end | |
| ); | |
| removed = true; | |
| } | |
| set_signal_status(effect2, DESTROYING); | |
| destroy_effect_children(effect2, remove_dom && !removed); | |
| remove_reactions(effect2, 0); | |
| var transitions = effect2.nodes && effect2.nodes.t; | |
| if (transitions !== null) { | |
| for (const transition of transitions) { | |
| transition.stop(); | |
| } | |
| } | |
| execute_effect_teardown(effect2); | |
| effect2.f ^= DESTROYING; | |
| effect2.f |= DESTROYED; | |
| var parent = effect2.parent; | |
| if (parent !== null && parent.first !== null) { | |
| unlink_effect(effect2); | |
| } | |
| effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes = effect2.ac = effect2.b = null; | |
| } | |
| function remove_effect_dom(node, end) { | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function unlink_effect(effect2) { | |
| var parent = effect2.parent; | |
| var prev = effect2.prev; | |
| var next2 = effect2.next; | |
| if (prev !== null) prev.next = next2; | |
| if (next2 !== null) next2.prev = prev; | |
| if (parent !== null) { | |
| if (parent.first === effect2) parent.first = next2; | |
| if (parent.last === effect2) parent.last = prev; | |
| } | |
| } | |
| function pause_effect(effect2, callback, destroy = true) { | |
| var transitions = []; | |
| pause_children(effect2, transitions, true); | |
| var fn = () => { | |
| if (destroy) destroy_effect(effect2); | |
| if (callback) callback(); | |
| }; | |
| var remaining = transitions.length; | |
| if (remaining > 0) { | |
| var check = () => --remaining || fn(); | |
| for (var transition of transitions) { | |
| transition.out(check); | |
| } | |
| } else { | |
| fn(); | |
| } | |
| } | |
| function pause_children(effect2, transitions, local) { | |
| if ((effect2.f & INERT) !== 0) return; | |
| effect2.f ^= INERT; | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transitions.push(transition); | |
| } | |
| } | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| if ((child2.f & ROOT_EFFECT) === 0) { | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || // If this is a branch effect without a block effect parent, | |
| // it means the parent block effect was pruned. In that case, | |
| // transparency information was transferred to the branch effect. | |
| (child2.f & BRANCH_EFFECT) !== 0 && (effect2.f & BLOCK_EFFECT) !== 0; | |
| pause_children(child2, transitions, transparent ? local : false); | |
| } | |
| child2 = sibling2; | |
| } | |
| } | |
| function resume_effect(effect2) { | |
| resume_children(effect2, true); | |
| } | |
| function resume_children(effect2, local) { | |
| if ((effect2.f & INERT) === 0) return; | |
| effect2.f ^= INERT; | |
| if ((effect2.f & CLEAN) === 0) { | |
| set_signal_status(effect2, DIRTY); | |
| Batch.ensure().schedule(effect2); | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; | |
| resume_children(child2, transparent ? local : false); | |
| child2 = sibling2; | |
| } | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transition.in(); | |
| } | |
| } | |
| } | |
| } | |
| function move_effect(effect2, fragment) { | |
| if (!effect2.nodes) return; | |
| var node = effect2.nodes.start; | |
| var end = effect2.nodes.end; | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| fragment.append(node); | |
| node = next2; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get$1(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get$1(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get$1(scope.store), name); | |
| } | |
| scope.store.set(get$1(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (official website)", | |
| cancel: "Cancel", | |
| enterCode: "Enter code", | |
| enterCodeAria: "Enter code you hear. Press Space to play audio.", | |
| enterCodeFromImage: "To proceed, please enter the code from the image below.", | |
| error: "Verification failed. Try again later.", | |
| expired: "Verification expired. Try again.", | |
| footer: 'Protected by <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (official website)">ALTCHA</a>', | |
| getAudioChallenge: "Get an audio challenge", | |
| label: "I'm not a robot", | |
| loading: "Loading...", | |
| reload: "Reload", | |
| verify: "Verify", | |
| verificationRequired: "Verification required!", | |
| verified: "Verified", | |
| verifying: "Verifying...", | |
| waitAlert: "Verifying... please wait." | |
| }; | |
| globalThis.$altcha.i18n.set("en", i18n); | |
| const PUBLIC_VERSION = "5"; | |
| if (typeof window !== "undefined") { | |
| ((window.__svelte ??= {}).v ??= /* @__PURE__ */ new Set()).add(PUBLIC_VERSION); | |
| } | |
| const event_symbol = /* @__PURE__ */ Symbol("events"); | |
| const all_registered_events = /* @__PURE__ */ new Set(); | |
| const root_event_handles = /* @__PURE__ */ new Set(); | |
| function create_event(event_name, dom, handler, options = {}) { | |
| function target_handler(event2) { | |
| if (!options.capture) { | |
| handle_event_propagation.call(dom, event2); | |
| } | |
| if (!event2.cancelBubble) { | |
| return without_reactive_context(() => { | |
| return handler?.call(this, event2); | |
| }); | |
| } | |
| } | |
| if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") { | |
| queue_micro_task(() => { | |
| dom.addEventListener(event_name, target_handler, options); | |
| }); | |
| } else { | |
| dom.addEventListener(event_name, target_handler, options); | |
| } | |
| return target_handler; | |
| } | |
| function event(event_name, dom, handler, capture2, passive) { | |
| var options = { capture: capture2, passive }; | |
| var target_handler = create_event(event_name, dom, handler, options); | |
| if (dom === document.body || // @ts-ignore | |
| dom === window || // @ts-ignore | |
| dom === document || // Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed | |
| dom instanceof HTMLMediaElement) { | |
| teardown(() => { | |
| dom.removeEventListener(event_name, target_handler, options); | |
| }); | |
| } | |
| } | |
| function delegated(event_name, element, handler) { | |
| (element[event_symbol] ??= {})[event_name] = handler; | |
| } | |
| function delegate(events) { | |
| for (var i = 0; i < events.length; i++) { | |
| all_registered_events.add(events[i]); | |
| } | |
| for (var fn of root_event_handles) { | |
| fn(events); | |
| } | |
| } | |
| let last_propagated_event = null; | |
| function handle_event_propagation(event2) { | |
| var handler_element = this; | |
| var owner_document = ( | |
| /** @type {Node} */ | |
| handler_element.ownerDocument | |
| ); | |
| var event_name = event2.type; | |
| var path = event2.composedPath?.() || []; | |
| var current_target = ( | |
| /** @type {null | Element} */ | |
| path[0] || event2.target | |
| ); | |
| last_propagated_event = event2; | |
| var path_idx = 0; | |
| var handled_at = last_propagated_event === event2 && event2[event_symbol]; | |
| if (handled_at) { | |
| var at_idx = path.indexOf(handled_at); | |
| if (at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ | |
| window)) { | |
| event2[event_symbol] = handler_element; | |
| return; | |
| } | |
| var handler_idx = path.indexOf(handler_element); | |
| if (handler_idx === -1) { | |
| return; | |
| } | |
| if (at_idx <= handler_idx) { | |
| path_idx = at_idx; | |
| } | |
| } | |
| current_target = /** @type {Element} */ | |
| path[path_idx] || event2.target; | |
| if (current_target === handler_element) return; | |
| define_property(event2, "currentTarget", { | |
| configurable: true, | |
| get() { | |
| return current_target || owner_document; | |
| } | |
| }); | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| var throw_error; | |
| var other_errors = []; | |
| while (current_target !== null) { | |
| var parent_element = current_target.assignedSlot || current_target.parentNode || /** @type {any} */ | |
| current_target.host || null; | |
| try { | |
| var delegated2 = current_target[event_symbol]?.[event_name]; | |
| if (delegated2 != null && (!/** @type {any} */ | |
| current_target.disabled || // DOM could've been updated already by the time this is reached, so we check this as well | |
| // -> the target could not have been disabled because it emits the event in the first place | |
| event2.target === current_target)) { | |
| delegated2.call(current_target, event2); | |
| } | |
| } catch (error) { | |
| if (throw_error) { | |
| other_errors.push(error); | |
| } else { | |
| throw_error = error; | |
| } | |
| } | |
| if (event2.cancelBubble || parent_element === handler_element || parent_element === null) { | |
| break; | |
| } | |
| current_target = parent_element; | |
| } | |
| if (throw_error) { | |
| for (let error of other_errors) { | |
| queueMicrotask(() => { | |
| throw error; | |
| }); | |
| } | |
| throw throw_error; | |
| } | |
| } finally { | |
| event2[event_symbol] = handler_element; | |
| delete event2.currentTarget; | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| const policy = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| globalThis?.window?.trustedTypes && /* @__PURE__ */ globalThis.window.trustedTypes.createPolicy("svelte-trusted-html", { | |
| /** @param {string} html */ | |
| createHTML: (html2) => { | |
| return html2; | |
| } | |
| }) | |
| ); | |
| function create_trusted_html(html2) { | |
| return ( | |
| /** @type {string} */ | |
| policy?.createHTML(html2) ?? html2 | |
| ); | |
| } | |
| function create_fragment_from_html(html2) { | |
| var elem = create_element("template"); | |
| elem.innerHTML = create_trusted_html(html2.replaceAll("<!>", "<!---->")); | |
| return elem.content; | |
| } | |
| function assign_nodes(start, end) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| if (effect2.nodes === null) { | |
| effect2.nodes = { start, end, a: null, t: null }; | |
| } | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_html(content, flags2) { | |
| var is_fragment = (flags2 & TEMPLATE_FRAGMENT) !== 0; | |
| var use_import_node = (flags2 & TEMPLATE_USE_IMPORT_NODE) !== 0; | |
| var node; | |
| var has_start = !content.startsWith("<!>"); | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (node === void 0) { | |
| node = create_fragment_from_html(has_start ? content : "<!>" + content); | |
| if (!is_fragment) node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(node); | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true) | |
| ); | |
| if (is_fragment) { | |
| var start = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(clone) | |
| ); | |
| var end = ( | |
| /** @type {TemplateNode} */ | |
| clone.lastChild | |
| ); | |
| assign_nodes(start, end); | |
| } else { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_namespace(content, flags2, ns = "svg") { | |
| var has_start = !content.startsWith("<!>"); | |
| var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`; | |
| var node; | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (!node) { | |
| var fragment = ( | |
| /** @type {DocumentFragment} */ | |
| create_fragment_from_html(wrapped) | |
| ); | |
| var root2 = ( | |
| /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(fragment) | |
| ); | |
| { | |
| node = /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(root2); | |
| } | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| node.cloneNode(true) | |
| ); | |
| { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_svg(content, flags2) { | |
| return /* @__PURE__ */ from_namespace(content, flags2, "svg"); | |
| } | |
| function text(value = "") { | |
| if (!hydrating) { | |
| var t = create_text(value + ""); | |
| assign_nodes(t, t); | |
| return t; | |
| } | |
| var node = hydrate_node; | |
| if (node.nodeType !== TEXT_NODE) { | |
| node.before(node = create_text()); | |
| set_hydrate_node(node); | |
| } else { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| node | |
| ); | |
| } | |
| assign_nodes(node, node); | |
| return node; | |
| } | |
| function comment() { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| var frag = document.createDocumentFragment(); | |
| var start = document.createComment(""); | |
| var anchor = create_text(); | |
| frag.append(start, anchor); | |
| assign_nodes(start, anchor); | |
| return frag; | |
| } | |
| function append(anchor, dom) { | |
| if (hydrating) { | |
| var effect2 = ( | |
| /** @type {Effect & { nodes: EffectNodes }} */ | |
| active_effect | |
| ); | |
| if ((effect2.f & REACTION_RAN) === 0 || effect2.nodes.end === null) { | |
| effect2.nodes.end = hydrate_node; | |
| } | |
| hydrate_next(); | |
| return; | |
| } | |
| if (anchor === null) { | |
| return; | |
| } | |
| anchor.before( | |
| /** @type {Node} */ | |
| dom | |
| ); | |
| } | |
| function is_capture_event(name) { | |
| return name.endsWith("capture") && name !== "gotpointercapture" && name !== "lostpointercapture"; | |
| } | |
| const DELEGATED_EVENTS = [ | |
| "beforeinput", | |
| "click", | |
| "change", | |
| "dblclick", | |
| "contextmenu", | |
| "focusin", | |
| "focusout", | |
| "input", | |
| "keydown", | |
| "keyup", | |
| "mousedown", | |
| "mousemove", | |
| "mouseout", | |
| "mouseover", | |
| "mouseup", | |
| "pointerdown", | |
| "pointermove", | |
| "pointerout", | |
| "pointerover", | |
| "pointerup", | |
| "touchend", | |
| "touchmove", | |
| "touchstart" | |
| ]; | |
| function can_delegate_event(event_name) { | |
| return DELEGATED_EVENTS.includes(event_name); | |
| } | |
| const ATTRIBUTE_ALIASES = { | |
| // no `class: 'className'` because we handle that separately | |
| formnovalidate: "formNoValidate", | |
| ismap: "isMap", | |
| nomodule: "noModule", | |
| playsinline: "playsInline", | |
| readonly: "readOnly", | |
| defaultvalue: "defaultValue", | |
| defaultchecked: "defaultChecked", | |
| srcobject: "srcObject", | |
| novalidate: "noValidate", | |
| allowfullscreen: "allowFullscreen", | |
| disablepictureinpicture: "disablePictureInPicture", | |
| disableremoteplayback: "disableRemotePlayback" | |
| }; | |
| function normalize_attribute(name) { | |
| name = name.toLowerCase(); | |
| return ATTRIBUTE_ALIASES[name] ?? name; | |
| } | |
| const PASSIVE_EVENTS = ["touchstart", "touchmove"]; | |
| function is_passive_event(name) { | |
| return PASSIVE_EVENTS.includes(name); | |
| } | |
| function set_text(text2, value) { | |
| var str = value == null ? "" : typeof value === "object" ? `${value}` : value; | |
| if (str !== /** @type {any} */ | |
| (text2[TEXT_CACHE] ??= text2.nodeValue)) { | |
| text2[TEXT_CACHE] = str; | |
| text2.nodeValue = `${str}`; | |
| } | |
| } | |
| function mount(component2, options) { | |
| return _mount(component2, options); | |
| } | |
| function hydrate(component2, options) { | |
| init_operations(); | |
| options.intro = options.intro ?? false; | |
| const target = options.target; | |
| const was_hydrating = hydrating; | |
| const previous_hydrate_node = hydrate_node; | |
| try { | |
| var anchor = /* @__PURE__ */ get_first_child(target); | |
| while (anchor && (anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| anchor.data !== HYDRATION_START)) { | |
| anchor = /* @__PURE__ */ get_next_sibling(anchor); | |
| } | |
| if (!anchor) { | |
| throw HYDRATION_ERROR; | |
| } | |
| set_hydrating(true); | |
| set_hydrate_node( | |
| /** @type {Comment} */ | |
| anchor | |
| ); | |
| const instance = _mount(component2, { ...options, anchor }); | |
| set_hydrating(false); | |
| return ( | |
| /** @type {Exports} */ | |
| instance | |
| ); | |
| } catch (error) { | |
| if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) { | |
| throw error; | |
| } | |
| if (error !== HYDRATION_ERROR) { | |
| console.warn("Failed to hydrate: ", error); | |
| } | |
| if (options.recover === false) { | |
| hydration_failed(); | |
| } | |
| init_operations(); | |
| clear_text_content(target); | |
| set_hydrating(false); | |
| return mount(component2, options); | |
| } finally { | |
| set_hydrating(was_hydrating); | |
| set_hydrate_node(previous_hydrate_node); | |
| } | |
| } | |
| const listeners = /* @__PURE__ */ new Map(); | |
| function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) { | |
| init_operations(); | |
| var component2 = void 0; | |
| var unmount2 = component_root(() => { | |
| var anchor_node = anchor ?? target.appendChild(create_text()); | |
| boundary( | |
| /** @type {TemplateNode} */ | |
| anchor_node, | |
| { | |
| pending: () => { | |
| } | |
| }, | |
| (anchor_node2) => { | |
| push({}); | |
| var ctx = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| if (context) ctx.c = context; | |
| if (events) { | |
| props.$$events = events; | |
| } | |
| if (hydrating) { | |
| assign_nodes( | |
| /** @type {TemplateNode} */ | |
| anchor_node2, | |
| null | |
| ); | |
| } | |
| component2 = Component(anchor_node2, props) || {}; | |
| if (hydrating) { | |
| active_effect.nodes.end = hydrate_node; | |
| if (hydrate_node === null || hydrate_node.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| hydrate_node.data !== HYDRATION_END) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| } | |
| pop(); | |
| }, | |
| transformError | |
| ); | |
| var registered_events = /* @__PURE__ */ new Set(); | |
| var event_handle = (events2) => { | |
| for (var i = 0; i < events2.length; i++) { | |
| var event_name = events2[i]; | |
| if (registered_events.has(event_name)) continue; | |
| registered_events.add(event_name); | |
| var passive = is_passive_event(event_name); | |
| for (const node of [target, document]) { | |
| var counts = listeners.get(node); | |
| if (counts === void 0) { | |
| counts = /* @__PURE__ */ new Map(); | |
| listeners.set(node, counts); | |
| } | |
| var count = counts.get(event_name); | |
| if (count === void 0) { | |
| node.addEventListener(event_name, handle_event_propagation, { passive }); | |
| counts.set(event_name, 1); | |
| } else { | |
| counts.set(event_name, count + 1); | |
| } | |
| } | |
| } | |
| }; | |
| event_handle(array_from(all_registered_events)); | |
| root_event_handles.add(event_handle); | |
| return () => { | |
| for (var event_name of registered_events) { | |
| for (const node of [target, document]) { | |
| var counts = ( | |
| /** @type {Map<string, number>} */ | |
| listeners.get(node) | |
| ); | |
| var count = ( | |
| /** @type {number} */ | |
| counts.get(event_name) | |
| ); | |
| if (--count == 0) { | |
| node.removeEventListener(event_name, handle_event_propagation); | |
| counts.delete(event_name); | |
| if (counts.size === 0) { | |
| listeners.delete(node); | |
| } | |
| } else { | |
| counts.set(event_name, count); | |
| } | |
| } | |
| } | |
| root_event_handles.delete(event_handle); | |
| if (anchor_node !== anchor) { | |
| anchor_node.parentNode?.removeChild(anchor_node); | |
| } | |
| }; | |
| }); | |
| mounted_components.set(component2, unmount2); | |
| return component2; | |
| } | |
| let mounted_components = /* @__PURE__ */ new WeakMap(); | |
| function unmount(component2, options) { | |
| const fn = mounted_components.get(component2); | |
| if (fn) { | |
| mounted_components.delete(component2); | |
| return fn(options); | |
| } | |
| return Promise.resolve(); | |
| } | |
| class BranchManager { | |
| /** @type {TemplateNode} */ | |
| anchor; | |
| /** @type {Map<Batch, Key>} */ | |
| #batches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Map of keys to effects that are currently rendered in the DOM. | |
| * These effects are visible and actively part of the document tree. | |
| * Example: | |
| * |
변경 전i18n.js
변경 후i18n.js
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
변경 전gd_board_view.js
| $(document).ready(function () { | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| $(document).ready(function () { | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 후gd_board_view.js
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| var gd_dom = function (bdId, sno, notice) { | |
| if($.trim(notice) === ''){ | |
| var formWrite = $('.js_form_write'); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 전gd_board_write.js
| } | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| } | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
변경 후gd_board_write.js
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
변경 전gd_common.js
| return formatted; | |
| }; | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = | |
| (obj).contentWindow.document.body.clientHeight; | |
변경 후gd_common.js
| return formatted; | |
| }; | |
| /* iframe(mypage 등)으로 board 목록이 실릴 때, onload 1회 측정(resize_frame/gd_resize_frame) 이후에도 | |
| 댓글/답글 폼 토글, ALTCHA 위젯 지연 렌더, 댓글 등록/삭제 등으로 내용 높이가 바뀌면 | |
| 부모 iframe 높이를 다시 맞춘다. body 높이가 실제로 변했을 때만 호출해 재측정 루프를 방지. */ | |
| (function () { | |
| let parentResize; | |
| try { | |
| if (window.parent === window) { | |
| return; // 최상위 문서 → 대상 아님 | |
| } | |
| parentResize = window.parent.gd_resize_frame || window.parent.resize_frame; | |
| } catch (e) { | |
| return; // cross-origin 부모 → 접근 불가, 대상 아님 | |
| } | |
| if (typeof parentResize !== 'function' || typeof window.ResizeObserver === 'undefined') { | |
| return; | |
| } | |
| const startObserve = function () { | |
| const frameEl = window.frameElement | |
| || (window.name ? window.parent.document.getElementsByName(window.name)[0] : null); | |
| if (!frameEl || !document.body) { | |
| return; | |
| } | |
| let timer = null; | |
| let lastHeight = -1; | |
| const observer = new ResizeObserver(function () { | |
| if (timer) { | |
| clearTimeout(timer); | |
| } | |
| timer = setTimeout(function () { | |
| const height = document.body.clientHeight; | |
| if (height === lastHeight) { | |
| return; // 실제 콘텐츠 높이 변화 없음 → 재측정 루프 방지 | |
| } | |
| lastHeight = height; | |
| parentResize.call(window.parent, frameEl); | |
| }, 100); | |
| }); | |
| observer.observe(document.body); | |
| }; | |
| if (document.body) { | |
| startObserve(); | |
| } else { | |
| document.addEventListener('DOMContentLoaded', startObserve); | |
| } | |
| })(); | |
| function gd_resize_frame(obj) { | |
| var iframeHeight = | |
| (obj).contentWindow.document.body.clientHeight; | |
변경 전gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: function () { | |
| return alert(__('자동등록방지 문자를 입력해주세요.')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| $(form).find('select').prop('disabled',false); | |
| $('.join_ok_btn').attr("disabled", true); | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: function () { | |
| return alert(__('자동등록방지 문자를 입력해주세요.')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| $(form).find('select').prop('disabled',false); | |
| $('.join_ok_btn').attr("disabled", true); | |
변경 후gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $(form).find('select').prop('disabled',false); | |
| $('.join_ok_btn').attr("disabled", true); | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $(form).find('select').prop('disabled',false); | |
| $('.join_ok_btn').attr("disabled", true); | |
변경 전join.html
| </form> | |
| </div> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| </form> | |
| </div> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
변경 후join.html
| </form> | |
| </div> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
| </form> | |
| </div> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| gd_select_email_domain('email'); | |
변경 전_join_view_captcha.html
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="./captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" id="reload_captcha" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| <div class="capcha"> | |
| <div class="capcha_img"><span><img src="./captcha.php" id="captchaImg" alt="{=__('자동등록방지 이미지')}"/></span></div> | |
| <div class="capcha_body"> | |
| <p class="capcha_text">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| <div class="capcha_input"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="captcha"/> | |
| </div> | |
| <div class="capcha_button"><button type="button" id="reload_captcha" class="captchareload_btn"><img src="../img/etc/icon-reset.png" alt="{=__('이미지 새로고침')}"> {=__('이미지 새로고침')}</button></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{/}--> | |
변경 후_join_view_captcha.html
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </div> | |
| <!--{/}--> | |
| <div class="join_view_other"> | |
| <div class="tit">{=__('자동등록방지')}</div> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </div> | |
| <!--{/}--> | |
변경 전_altcha.html
변경 후_altcha.html
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Mobile\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Mobile\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
변경 전view.html
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전view.html
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전view.html
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
변경 후view.html
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap ty3"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전write.html
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| <!--{ / }--> | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" | |
| onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" onclick="captchaReload()" class="normal-btn small1 captchareload"> | |
| <em><img src="img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 후write.html
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
| var bdSno = '{=gd_isset(req.sno)}'; | |
| </script> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_write.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| // type="module" 스크립트는 팝업(AJAX append) 시 실행되지 않으므로, | |
| // 일반 인라인 스크립트에서 module 을 동적 주입해 직접진입/팝업 모두 커버한다. | |
| if (!customElements.get('altcha-widget')) { | |
| ['\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js', '\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js'].forEach(function (src) { | |
| const s = document.createElement('script'); | |
| s.type = 'module'; | |
| s.src = src; | |
| document.head.appendChild(s); | |
| }); | |
| } | |
| </script> | |
| <div class="ly_head"> | |
| <h1 class="h_tit elp">{=__('글쓰기')}</h1> | |
| </div> | |
| <!--{ / }--> | |
| <!--{ ? bdWrite.cfg.bdSpamBoardFl&2 }--> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </div> | |
변경 전goods_board_qa_list.html
| {*** 상품상세 - 상품 문의 목록 | goods/goods_board_qa_list.php ***} | |
| <div class="detail_review prd_inquiry" style="display:block"> | |
| <ul> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <!--{ ? .blockFl =='y' }--> | |
| <li class="noclick"> | |
| <!--{ : }--> | |
| <li class="private <!--{? .replyComplete }-->done<!--{/}-->"> | |
| <!--{ / }--> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| <em class="ico_ans">{.replyStatusText}</em> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> --> | |
| <!--{ / }--> | |
| <a class="js-board-qa-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span><span class="bar"></span><span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-qa-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}">{=__('상품평 더보기')}</button> | |
| </div> | |
| <div class="js-goodsqa-{.sno}"> | |
| </div> | |
| </li> | |
| <!--{/}--> | |
| <!--{/}--> | |
| </ul> | |
| </div> | |
| <div class="js-board-goodsqa-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsqa-view').off().on('touchstart', '.js-board-qa-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| if($(".js-goodsqa-"+$(this).data('sno')).html().trim() !='') { | |
| $(".js-goodsqa-"+$(this).data('sno')).html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),''); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on('click', '.js-board-goodsqa-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
| {*** 상품상세 - 상품 문의 목록 | goods/goods_board_qa_list.php ***} | |
| <div class="detail_review prd_inquiry" style="display:block"> | |
| <ul> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <!--{ ? .blockFl =='y' }--> | |
| <li class="noclick"> | |
| <!--{ : }--> | |
| <li class="private <!--{? .replyComplete }-->done<!--{/}-->"> | |
| <!--{ / }--> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| <em class="ico_ans">{.replyStatusText}</em> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> --> | |
| <!--{ / }--> | |
| <a class="js-board-qa-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span><span class="bar"></span><span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-qa-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}">{=__('상품평 더보기')}</button> | |
| </div> | |
| <div class="js-goodsqa-{.sno}"> | |
| </div> | |
| </li> | |
| <!--{/}--> | |
| <!--{/}--> | |
| </ul> | |
| </div> | |
| <div class="js-board-goodsqa-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsqa-view').off().on('touchstart', '.js-board-qa-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| if($(".js-goodsqa-"+$(this).data('sno')).html().trim() !='') { | |
| $(".js-goodsqa-"+$(this).data('sno')).html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),''); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on('click', '.js-board-goodsqa-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
변경 후goods_board_qa_list.html
| {*** 상품상세 - 상품 문의 목록 | goods/goods_board_qa_list.php ***} | |
| <div class="detail_review prd_inquiry" style="display:block"> | |
| <ul> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <!--{ ? .blockFl =='y' }--> | |
| <li class="noclick"> | |
| <!--{ : }--> | |
| <li class="private <!--{? .replyComplete }-->done<!--{/}-->"> | |
| <!--{ / }--> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| <em class="ico_ans">{.replyStatusText}</em> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> --> | |
| <!--{ / }--> | |
| <a class="js-board-qa-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span><span class="bar"></span><span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-qa-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}">{=__('상품평 더보기')}</button> | |
| </div> | |
| <div class="js-goodsqa-{.sno}"> | |
| </div> | |
| </li> | |
| <!--{/}--> | |
| <!--{/}--> | |
| </ul> | |
| </div> | |
| <div class="js-board-goodsqa-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsqa-view').off().on('touchstart', '.js-board-qa-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| if($(".js-goodsqa-"+$(this).data('sno')).html().trim() !='') { | |
| $(".js-goodsqa-"+$(this).data('sno')).html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),''); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on('click', '.js-board-goodsqa-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
| {*** 상품상세 - 상품 문의 목록 | goods/goods_board_qa_list.php ***} | |
| <div class="detail_review prd_inquiry" style="display:block"> | |
| <ul> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <!--{ ? .blockFl =='y' }--> | |
| <li class="noclick"> | |
| <!--{ : }--> | |
| <li class="private <!--{? .replyComplete }-->done<!--{/}-->"> | |
| <!--{ / }--> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| <em class="ico_ans">{.replyStatusText}</em> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> --> | |
| <!--{ / }--> | |
| <a class="js-board-qa-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <!-- <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> --> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span><span class="bar"></span><span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-qa-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}">{=__('상품평 더보기')}</button> | |
| </div> | |
| <div class="js-goodsqa-{.sno}"> | |
| </div> | |
| </li> | |
| <!--{/}--> | |
| <!--{/}--> | |
| </ul> | |
| </div> | |
| <div class="js-board-goodsqa-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsqa-view').off().on('touchstart', '.js-board-qa-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| if($(".js-goodsqa-"+$(this).data('sno')).html().trim() !='') { | |
| $(".js-goodsqa-"+$(this).data('sno')).html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),''); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on('click', '.js-board-goodsqa-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsqa-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
변경 전goods_board_review_list.html
| {*** 상품상세 - 상품 문의/후기 목록 | goods/goods_board_review_list.php ***} | |
| <div class="detail_review" style="display:block"> | |
| <!--{? bdList.noticeList }--> | |
| <!--{ @ bdList.noticeList }--> | |
| <ul> | |
| <li> | |
| <div class="item-list-summary"> | |
| <img src="{bdList.cfg.iconImage.notice.url}" /> | |
| <strong class="title"> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y"><strong>{.subject}</strong></a> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="y"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{/}--> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <ul> | |
| <li class="<!--{ ? .blockFl =='y'}--> noclick<!--{ / }-->"> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" style="padding-left:15px;" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> | |
| <!--{ / }--> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <span class="star_box"><span class="star_li" style="width:{.goodsPt*20}%;">{=__('별점')} {=.goodsPt}</span></span> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="n"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{:}--> | |
| <ul class="not-record"> | |
| <li class="no-data">{=__('등록된 상품후기가 없습니다.')}</li> | |
| </ul> | |
| <!--{/}--> | |
| </div> | |
| <div class="js-board-goodsreview-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsreview-view').off().on('touchstart', '.js-board-review-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| var notice = $(this).data('notice'); | |
| if($(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html().trim() !='') { | |
| $(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),notice); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on('click', '.js-board-goodsreview-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
| {*** 상품상세 - 상품 문의/후기 목록 | goods/goods_board_review_list.php ***} | |
| <div class="detail_review" style="display:block"> | |
| <!--{? bdList.noticeList }--> | |
| <!--{ @ bdList.noticeList }--> | |
| <ul> | |
| <li> | |
| <div class="item-list-summary"> | |
| <img src="{bdList.cfg.iconImage.notice.url}" /> | |
| <strong class="title"> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y"><strong>{.subject}</strong></a> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="y"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{/}--> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <ul> | |
| <li class="<!--{ ? .blockFl =='y'}--> noclick<!--{ / }-->"> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" style="padding-left:15px;" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> | |
| <!--{ / }--> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <span class="star_box"><span class="star_li" style="width:{.goodsPt*20}%;">{=__('별점')} {=.goodsPt}</span></span> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="n"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{:}--> | |
| <ul class="not-record"> | |
| <li class="no-data">{=__('등록된 상품후기가 없습니다.')}</li> | |
| </ul> | |
| <!--{/}--> | |
| </div> | |
| <div class="js-board-goodsreview-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsreview-view').off().on('touchstart', '.js-board-review-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| var notice = $(this).data('notice'); | |
| if($(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html().trim() !='') { | |
| $(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),notice); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on('click', '.js-board-goodsreview-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
변경 후goods_board_review_list.html
| {*** 상품상세 - 상품 문의/후기 목록 | goods/goods_board_review_list.php ***} | |
| <div class="detail_review" style="display:block"> | |
| <!--{? bdList.noticeList }--> | |
| <!--{ @ bdList.noticeList }--> | |
| <ul> | |
| <li> | |
| <div class="item-list-summary"> | |
| <img src="{bdList.cfg.iconImage.notice.url}" /> | |
| <strong class="title"> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y"><strong>{.subject}</strong></a> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="y"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{/}--> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <ul> | |
| <li class="<!--{ ? .blockFl =='y'}--> noclick<!--{ / }-->"> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" style="padding-left:15px;" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> | |
| <!--{ / }--> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <span class="star_box"><span class="star_li" style="width:{.goodsPt*20}%;">{=__('별점')} {=.goodsPt}</span></span> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="n"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{:}--> | |
| <ul class="not-record"> | |
| <li class="no-data">{=__('등록된 상품후기가 없습니다.')}</li> | |
| </ul> | |
| <!--{/}--> | |
| </div> | |
| <div class="js-board-goodsreview-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsreview-view').off().on('touchstart', '.js-board-review-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| var notice = $(this).data('notice'); | |
| if($(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html().trim() !='') { | |
| $(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),notice); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on('click', '.js-board-goodsreview-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
| {*** 상품상세 - 상품 문의/후기 목록 | goods/goods_board_review_list.php ***} | |
| <div class="detail_review" style="display:block"> | |
| <!--{? bdList.noticeList }--> | |
| <!--{ @ bdList.noticeList }--> | |
| <ul> | |
| <li> | |
| <div class="item-list-summary"> | |
| <img src="{bdList.cfg.iconImage.notice.url}" /> | |
| <strong class="title"> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y"><strong>{.subject}</strong></a> | |
| </strong> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="y">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="y"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{/}--> | |
| <!--{? bdList.list }--> | |
| <!--{ @ bdList.list }--> | |
| <ul> | |
| <li class="<!--{ ? .blockFl =='y'}--> noclick<!--{ / }-->"> | |
| <div class="item-list-summary"> | |
| <strong class="title"> | |
| {.gapReply} | |
| <span <!--{ ? .groupThread }-->class="reply" style="padding-left:15px;" <!--{/}-->> | |
| <!--{ ? .isSecret == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.secret.url}" align=absmiddle> | |
| <!--{ / }--> | |
| <a class="js-board-review-detail js-{req.bdId}-detail-{.sno}" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n"><!--{ ? .blockFl =='y'}-->차단 한 회원이 작성한 게시물입니다.<!--{ : }-->{.subject}<!--{ / }--></a> | |
| <!--{ ? .isFile == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_file.url}" alt="{=__('파일첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isImage == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.attach_img.url}" alt="{=__('이미지첨부 있음')}"/> | |
| <!--{/}--> | |
| <!--{ ? .isNew == 'y' }--> | |
| <img src="{bdList.cfg.iconImage.new.url}" alt="{=__('신규 등록글')}"/> | |
| <!--{/}--> | |
| </span> | |
| </strong> | |
| <span class="star_box"><span class="star_li" style="width:{.goodsPt*20}%;">{=__('별점')} {=.goodsPt}</span></span> | |
| <div class="author-box"> | |
| <span class="name">{.writer}</span> | |
| <span class="date"> {.regDate}</span> | |
| </div> | |
| <button type="button" class="btn_more js-board-review-detail" data-bdid="{req.bdId}" data-sno="{.sno}" data-auth="{.auth.view}" data-goodsno="{.goodsNo}" data-notice="n">상품평 더보기</button> | |
| </div> | |
| <div class="js-goodsreview-{.sno}" data-notice="n"> | |
| </div> | |
| </li> | |
| </ul> | |
| <!--{/}--> | |
| <!--{:}--> | |
| <ul class="not-record"> | |
| <li class="no-data">{=__('등록된 상품후기가 없습니다.')}</li> | |
| </ul> | |
| <!--{/}--> | |
| </div> | |
| <div class="js-board-goodsreview-more review_more"> | |
| <button type="button" data-next-page="{pageData.next}">{=__('상품평 더보기')} {pageData.listCount}<span>/</span>{pageData.total}</button> | |
| </div> | |
| <!--{? pageData.now =='1' }--> | |
| <script type="text/javascript" src="\{=c.PATH_MOBILE_SKIN}js/gd_board_view.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| <!-- | |
| $(document).ready(function () { | |
| $('.js-board-goodsreview-view').off().on('touchstart', '.js-board-review-detail', function (e) { | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| var notice = $(this).data('notice'); | |
| if($(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html().trim() !='') { | |
| $(".js-goodsreview-"+$(this).data('sno')+"[data-notice="+notice+"]").html(''); | |
| $(this).closest("li").removeClass("selected"); | |
| } else { | |
| viewGoodsBoard($(this).data('bdid'),$(this).data('sno'),$(this).data('auth'),$(this).data('goodsno'),notice); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on('click', '.js-board-goodsreview-more button', function (e) { | |
| if($(this).data('next-page') > 0 ) { | |
| loadGoodsBoardList('{req.bdId}','{req.goodsNo}',$(this).data('next-page')); | |
| } | |
| }); | |
| $('.js-board-goodsreview-view').on("DOMSubtreeModified", '.detail_review ul > li > div:last-child',function() { | |
| if ($(this).children('#boardContent').length > 0) { | |
| if ($(this).data('auth') != 'n') $(this).closest("li").addClass("selected"); | |
| } | |
| }); | |
| }); | |
| //--> | |
| </script> | |
| <!--{/}--> | |
변경 전goods_board_view.html
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap" style="margin-top: 10px;"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="../img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap" style="margin-top: 10px;"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="../img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap" style="margin-top: 10px;"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="../img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </table> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap" style="margin-top: 10px;"> | |
| <td class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="../board/captcha.php" align="absmiddle" class="captchaImg"> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">보이는 순서대로 <br>숫자 및 문자를 모두 입력해 주세요.</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onkeyup="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="문자를 입력해주세요." class="text captcha"> | |
| </div> | |
| <button type="button" onclick="gd_reload_reply_captcha()" class="normal-btn small1 captchareload"> | |
| <em><img src="../img/etc/icon-reset.png" alt="" class="va-m"> 이미지 새로고침</em> | |
| </button> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </table> | |
| </div> | |
변경 후goods_board_view.html
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <tr class="input_wrap" style="margin-top: 10px;"> | |
| <td class="capcha capcha_altcha"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </td> | |
| </tr> | |
| <!--{ / }--> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </table> | |
| </div> | |
| </td> | |
| </tr> | |
| <!--{ ? bdView.cfg.bdSpamMemoFl & 2 }--> | |
| <div class="input_wrap"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', '../board/captcha.php')} | |
| </div> | |
| <!--{ / }--> | |
| </table> | |
| </div> | |
변경 전goods_view.html
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx110"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx110"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
변경 후goods_view.html
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx110"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
| <!--{ / }--> | |
| <div id="layerDim" class="dn zidx110"> </div> | |
| <script type="text/javascript" src="../js/gd_board_goods.js" charset="utf-8"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| {=fbGoodsViewScript} | |
| {#footer} | |
변경 전altcha.js
변경 후altcha.js
| const DEV = false; | |
| var is_array = Array.isArray; | |
| var index_of = Array.prototype.indexOf; | |
| var includes = Array.prototype.includes; | |
| var array_from = Array.from; | |
| var object_keys = Object.keys; | |
| var define_property = Object.defineProperty; | |
| var get_descriptor = Object.getOwnPropertyDescriptor; | |
| var get_descriptors = Object.getOwnPropertyDescriptors; | |
| var object_prototype = Object.prototype; | |
| var array_prototype = Array.prototype; | |
| var get_prototype_of = Object.getPrototypeOf; | |
| var is_extensible = Object.isExtensible; | |
| const noop = () => { | |
| }; | |
| function run_all(arr) { | |
| for (var i = 0; i < arr.length; i++) { | |
| arr[i](); | |
| } | |
| } | |
| function deferred() { | |
| var resolve; | |
| var reject; | |
| var promise = new Promise((res, rej) => { | |
| resolve = res; | |
| reject = rej; | |
| }); | |
| return { promise, resolve, reject }; | |
| } | |
| const DERIVED = 1 << 1; | |
| const EFFECT = 1 << 2; | |
| const RENDER_EFFECT = 1 << 3; | |
| const MANAGED_EFFECT = 1 << 24; | |
| const BLOCK_EFFECT = 1 << 4; | |
| const BRANCH_EFFECT = 1 << 5; | |
| const ROOT_EFFECT = 1 << 6; | |
| const BOUNDARY_EFFECT = 1 << 7; | |
| const CONNECTED = 1 << 9; | |
| const CLEAN = 1 << 10; | |
| const DIRTY = 1 << 11; | |
| const MAYBE_DIRTY = 1 << 12; | |
| const INERT = 1 << 13; | |
| const DESTROYED = 1 << 14; | |
| const REACTION_RAN = 1 << 15; | |
| const DESTROYING = 1 << 25; | |
| const EFFECT_TRANSPARENT = 1 << 16; | |
| const EAGER_EFFECT = 1 << 17; | |
| const HEAD_EFFECT = 1 << 18; | |
| const EFFECT_PRESERVED = 1 << 19; | |
| const USER_EFFECT = 1 << 20; | |
| const WAS_MARKED = 1 << 16; | |
| const REACTION_IS_UPDATING = 1 << 21; | |
| const ASYNC = 1 << 22; | |
| const ERROR_VALUE = 1 << 23; | |
| const STATE_SYMBOL = /* @__PURE__ */ Symbol("$state"); | |
| const LEGACY_PROPS = /* @__PURE__ */ Symbol("legacy props"); | |
| const LOADING_ATTR_SYMBOL = /* @__PURE__ */ Symbol(""); | |
| const ATTRIBUTES_CACHE = /* @__PURE__ */ Symbol("attributes"); | |
| const CLASS_CACHE = /* @__PURE__ */ Symbol("class"); | |
| const STYLE_CACHE = /* @__PURE__ */ Symbol("style"); | |
| const TEXT_CACHE = /* @__PURE__ */ Symbol("text"); | |
| const FORM_RESET_HANDLER = /* @__PURE__ */ Symbol("form reset"); | |
| const STALE_REACTION = new class StaleReactionError extends Error { | |
| name = "StaleReactionError"; | |
| message = "The reaction that called `getAbortSignal()` was re-run or destroyed"; | |
| }(); | |
| const IS_XHTML = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| !!globalThis.document?.contentType && /* @__PURE__ */ globalThis.document.contentType.includes("xml") | |
| ); | |
| const TEXT_NODE = 3; | |
| const COMMENT_NODE = 8; | |
| function equals(value) { | |
| return value === this.v; | |
| } | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function safe_equals(value) { | |
| return !safe_not_equal(value, this.v); | |
| } | |
| function lifecycle_outside_component(name) { | |
| { | |
| throw new Error(`https://svelte.dev/e/lifecycle_outside_component`); | |
| } | |
| } | |
| function async_derived_orphan() { | |
| { | |
| throw new Error(`https://svelte.dev/e/async_derived_orphan`); | |
| } | |
| } | |
| function effect_in_teardown(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_teardown`); | |
| } | |
| } | |
| function effect_in_unowned_derived() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_in_unowned_derived`); | |
| } | |
| } | |
| function effect_orphan(rune) { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_orphan`); | |
| } | |
| } | |
| function effect_update_depth_exceeded() { | |
| { | |
| throw new Error(`https://svelte.dev/e/effect_update_depth_exceeded`); | |
| } | |
| } | |
| function hydration_failed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/hydration_failed`); | |
| } | |
| } | |
| function state_descriptors_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_descriptors_fixed`); | |
| } | |
| } | |
| function state_prototype_fixed() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_prototype_fixed`); | |
| } | |
| } | |
| function state_unsafe_mutation() { | |
| { | |
| throw new Error(`https://svelte.dev/e/state_unsafe_mutation`); | |
| } | |
| } | |
| function svelte_boundary_reset_onerror() { | |
| { | |
| throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); | |
| } | |
| } | |
| let tracing_mode_flag = false; | |
| const TEMPLATE_FRAGMENT = 1; | |
| const TEMPLATE_USE_IMPORT_NODE = 1 << 1; | |
| const HYDRATION_START = "["; | |
| const HYDRATION_START_ELSE = "[!"; | |
| const HYDRATION_START_FAILED = "[?"; | |
| const HYDRATION_END = "]"; | |
| const HYDRATION_ERROR = {}; | |
| const UNINITIALIZED = /* @__PURE__ */ Symbol("uninitialized"); | |
| const NAMESPACE_HTML = "http://www.w3.org/1999/xhtml"; | |
| const NAMESPACE_SVG = "http://www.w3.org/2000/svg"; | |
| const NAMESPACE_MATHML = "http://www.w3.org/1998/Math/MathML"; | |
| const ATTACHMENT_KEY = "@attach"; | |
| let component_context = null; | |
| function set_component_context(context) { | |
| component_context = context; | |
| } | |
| function push(props, runes = false, fn) { | |
| component_context = { | |
| p: component_context, | |
| i: false, | |
| c: null, | |
| e: null, | |
| s: props, | |
| x: null, | |
| r: ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ), | |
| l: null | |
| }; | |
| } | |
| function pop(component2) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| var effects = context.e; | |
| if (effects !== null) { | |
| context.e = null; | |
| for (var fn of effects) { | |
| create_user_effect(fn); | |
| } | |
| } | |
| if (component2 !== void 0) { | |
| context.x = component2; | |
| } | |
| context.i = true; | |
| component_context = context.p; | |
| return component2 ?? /** @type {T} */ | |
| {}; | |
| } | |
| function is_runes() { | |
| return true; | |
| } | |
| let micro_tasks = []; | |
| function run_micro_tasks() { | |
| var tasks = micro_tasks; | |
| micro_tasks = []; | |
| run_all(tasks); | |
| } | |
| function queue_micro_task(fn) { | |
| if (micro_tasks.length === 0 && !is_flushing_sync) { | |
| var tasks = micro_tasks; | |
| queueMicrotask(() => { | |
| if (tasks === micro_tasks) run_micro_tasks(); | |
| }); | |
| } | |
| micro_tasks.push(fn); | |
| } | |
| function flush_tasks() { | |
| while (micro_tasks.length > 0) { | |
| run_micro_tasks(); | |
| } | |
| } | |
| function derived_inert() { | |
| { | |
| console.warn(`https://svelte.dev/e/derived_inert`); | |
| } | |
| } | |
| function hydration_mismatch(location2) { | |
| { | |
| console.warn(`https://svelte.dev/e/hydration_mismatch`); | |
| } | |
| } | |
| function select_multiple_invalid_value() { | |
| { | |
| console.warn(`https://svelte.dev/e/select_multiple_invalid_value`); | |
| } | |
| } | |
| function svelte_boundary_reset_noop() { | |
| { | |
| console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`); | |
| } | |
| } | |
| let hydrating = false; | |
| function set_hydrating(value) { | |
| hydrating = value; | |
| } | |
| let hydrate_node; | |
| function set_hydrate_node(node) { | |
| if (node === null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return hydrate_node = node; | |
| } | |
| function hydrate_next() { | |
| return set_hydrate_node(/* @__PURE__ */ get_next_sibling(hydrate_node)); | |
| } | |
| function reset(node) { | |
| if (!hydrating) return; | |
| if (/* @__PURE__ */ get_next_sibling(hydrate_node) !== null) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| hydrate_node = node; | |
| } | |
| function next(count = 1) { | |
| if (hydrating) { | |
| var i = count; | |
| var node = hydrate_node; | |
| while (i--) { | |
| node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node); | |
| } | |
| hydrate_node = node; | |
| } | |
| } | |
| function skip_nodes(remove = true) { | |
| var depth = 0; | |
| var node = hydrate_node; | |
| while (true) { | |
| if (node.nodeType === COMMENT_NODE) { | |
| var data = ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| if (data === HYDRATION_END) { | |
| if (depth === 0) return node; | |
| depth -= 1; | |
| } else if (data === HYDRATION_START || data === HYDRATION_START_ELSE || // "[1", "[2", etc. for if blocks | |
| data[0] === "[" && !isNaN(Number(data.slice(1)))) { | |
| depth += 1; | |
| } | |
| } | |
| var next2 = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(node) | |
| ); | |
| if (remove) node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function read_hydration_instruction(node) { | |
| if (!node || node.nodeType !== COMMENT_NODE) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| return ( | |
| /** @type {Comment} */ | |
| node.data | |
| ); | |
| } | |
| function proxy(value) { | |
| if (typeof value !== "object" || value === null || STATE_SYMBOL in value) { | |
| return value; | |
| } | |
| const prototype = get_prototype_of(value); | |
| if (prototype !== object_prototype && prototype !== array_prototype) { | |
| return value; | |
| } | |
| var sources = /* @__PURE__ */ new Map(); | |
| var is_proxied_array = is_array(value); | |
| var version = /* @__PURE__ */ state(0); | |
| var parent_version = update_version; | |
| var with_parent = (fn) => { | |
| if (update_version === parent_version) { | |
| return fn(); | |
| } | |
| var reaction = active_reaction; | |
| var version2 = update_version; | |
| set_active_reaction(null); | |
| set_update_version(parent_version); | |
| var result = fn(); | |
| set_active_reaction(reaction); | |
| set_update_version(version2); | |
| return result; | |
| }; | |
| if (is_proxied_array) { | |
| sources.set("length", /* @__PURE__ */ state( | |
| /** @type {any[]} */ | |
| value.length | |
| )); | |
| } | |
| return new Proxy( | |
| /** @type {any} */ | |
| value, | |
| { | |
| defineProperty(_, prop2, descriptor) { | |
| if (!("value" in descriptor) || descriptor.configurable === false || descriptor.enumerable === false || descriptor.writable === false) { | |
| state_descriptors_fixed(); | |
| } | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| with_parent(() => { | |
| var s2 = /* @__PURE__ */ state(descriptor.value); | |
| sources.set(prop2, s2); | |
| return s2; | |
| }); | |
| } else { | |
| set(s, descriptor.value, true); | |
| } | |
| return true; | |
| }, | |
| deleteProperty(target, prop2) { | |
| var s = sources.get(prop2); | |
| if (s === void 0) { | |
| if (prop2 in target) { | |
| const s2 = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(prop2, s2); | |
| increment(version); | |
| } | |
| } else { | |
| set(s, UNINITIALIZED); | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| get(target, prop2, receiver) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return value; | |
| } | |
| var s = sources.get(prop2); | |
| var exists = prop2 in target; | |
| if (s === void 0 && (!exists || get_descriptor(target, prop2)?.writable)) { | |
| s = with_parent(() => { | |
| var p = proxy(exists ? target[prop2] : UNINITIALIZED); | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| if (s !== void 0) { | |
| var v = get(s); | |
| return v === UNINITIALIZED ? void 0 : v; | |
| } | |
| return Reflect.get(target, prop2, receiver); | |
| }, | |
| getOwnPropertyDescriptor(target, prop2) { | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor && "value" in descriptor) { | |
| var s = sources.get(prop2); | |
| if (s) descriptor.value = get(s); | |
| } else if (descriptor === void 0) { | |
| var source2 = sources.get(prop2); | |
| var value2 = source2?.v; | |
| if (source2 !== void 0 && value2 !== UNINITIALIZED) { | |
| return { | |
| enumerable: true, | |
| configurable: true, | |
| value: value2, | |
| writable: true | |
| }; | |
| } | |
| } | |
| return descriptor; | |
| }, | |
| has(target, prop2) { | |
| if (prop2 === STATE_SYMBOL) { | |
| return true; | |
| } | |
| var s = sources.get(prop2); | |
| var has = s !== void 0 && s.v !== UNINITIALIZED || Reflect.has(target, prop2); | |
| if (s !== void 0 || active_effect !== null && (!has || get_descriptor(target, prop2)?.writable)) { | |
| if (s === void 0) { | |
| s = with_parent(() => { | |
| var p = has ? proxy(target[prop2]) : UNINITIALIZED; | |
| var s2 = /* @__PURE__ */ state(p); | |
| return s2; | |
| }); | |
| sources.set(prop2, s); | |
| } | |
| var value2 = get(s); | |
| if (value2 === UNINITIALIZED) { | |
| return false; | |
| } | |
| } | |
| return has; | |
| }, | |
| set(target, prop2, value2, receiver) { | |
| var s = sources.get(prop2); | |
| var has = prop2 in target; | |
| if (is_proxied_array && prop2 === "length") { | |
| for (var i = value2; i < /** @type {Source<number>} */ | |
| s.v; i += 1) { | |
| var other_s = sources.get(i + ""); | |
| if (other_s !== void 0) { | |
| set(other_s, UNINITIALIZED); | |
| } else if (i in target) { | |
| other_s = with_parent(() => /* @__PURE__ */ state(UNINITIALIZED)); | |
| sources.set(i + "", other_s); | |
| } | |
| } | |
| } | |
| if (s === void 0) { | |
| if (!has || get_descriptor(target, prop2)?.writable) { | |
| s = with_parent(() => /* @__PURE__ */ state(void 0)); | |
| set(s, proxy(value2)); | |
| sources.set(prop2, s); | |
| } | |
| } else { | |
| has = s.v !== UNINITIALIZED; | |
| var p = with_parent(() => proxy(value2)); | |
| set(s, p); | |
| } | |
| var descriptor = Reflect.getOwnPropertyDescriptor(target, prop2); | |
| if (descriptor?.set) { | |
| descriptor.set.call(receiver, value2); | |
| } | |
| if (!has) { | |
| if (is_proxied_array && typeof prop2 === "string") { | |
| var ls = ( | |
| /** @type {Source<number>} */ | |
| sources.get("length") | |
| ); | |
| var n = Number(prop2); | |
| if (Number.isInteger(n) && n >= ls.v) { | |
| set(ls, n + 1); | |
| } | |
| } | |
| increment(version); | |
| } | |
| return true; | |
| }, | |
| ownKeys(target) { | |
| get(version); | |
| var own_keys = Reflect.ownKeys(target).filter((key3) => { | |
| var source3 = sources.get(key3); | |
| return source3 === void 0 || source3.v !== UNINITIALIZED; | |
| }); | |
| for (var [key2, source2] of sources) { | |
| if (source2.v !== UNINITIALIZED && !(key2 in target)) { | |
| own_keys.push(key2); | |
| } | |
| } | |
| return own_keys; | |
| }, | |
| setPrototypeOf() { | |
| state_prototype_fixed(); | |
| } | |
| } | |
| ); | |
| } | |
| function get_proxied_value(value) { | |
| try { | |
| if (value !== null && typeof value === "object" && STATE_SYMBOL in value) { | |
| return value[STATE_SYMBOL]; | |
| } | |
| } catch { | |
| } | |
| return value; | |
| } | |
| function is(a, b) { | |
| return Object.is(get_proxied_value(a), get_proxied_value(b)); | |
| } | |
| var $window; | |
| var $document; | |
| var is_firefox; | |
| var first_child_getter; | |
| var next_sibling_getter; | |
| function init_operations() { | |
| if ($window !== void 0) { | |
| return; | |
| } | |
| $window = window; | |
| $document = document; | |
| is_firefox = /Firefox/.test(navigator.userAgent); | |
| var element_prototype = Element.prototype; | |
| var node_prototype = Node.prototype; | |
| var text_prototype = Text.prototype; | |
| first_child_getter = get_descriptor(node_prototype, "firstChild").get; | |
| next_sibling_getter = get_descriptor(node_prototype, "nextSibling").get; | |
| if (is_extensible(element_prototype)) { | |
| element_prototype[CLASS_CACHE] = void 0; | |
| element_prototype[ATTRIBUTES_CACHE] = null; | |
| element_prototype[STYLE_CACHE] = void 0; | |
| element_prototype.__e = void 0; | |
| } | |
| if (is_extensible(text_prototype)) { | |
| text_prototype[TEXT_CACHE] = void 0; | |
| } | |
| } | |
| function create_text(value = "") { | |
| return document.createTextNode(value); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_first_child(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| first_child_getter.call(node) | |
| ); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function get_next_sibling(node) { | |
| return ( | |
| /** @type {TemplateNode | null} */ | |
| next_sibling_getter.call(node) | |
| ); | |
| } | |
| function child(node, is_text) { | |
| if (!hydrating) { | |
| return /* @__PURE__ */ get_first_child(node); | |
| } | |
| var child2 = /* @__PURE__ */ get_first_child(hydrate_node); | |
| if (child2 === null) { | |
| child2 = hydrate_node.appendChild(create_text()); | |
| } else if (is_text && child2.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| child2?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| if (is_text) { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| child2 | |
| ); | |
| } | |
| set_hydrate_node(child2); | |
| return child2; | |
| } | |
| function first_child(node, is_text = false) { | |
| if (!hydrating) { | |
| var first = /* @__PURE__ */ get_first_child(node); | |
| if (first instanceof Comment && first.data === "") return /* @__PURE__ */ get_next_sibling(first); | |
| return first; | |
| } | |
| if (is_text) { | |
| if (hydrate_node?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| hydrate_node?.before(text2); | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| hydrate_node | |
| ); | |
| } | |
| return hydrate_node; | |
| } | |
| function sibling(node, count = 1, is_text = false) { | |
| let next_sibling = hydrating ? hydrate_node : node; | |
| var last_sibling; | |
| while (count--) { | |
| last_sibling = next_sibling; | |
| next_sibling = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_next_sibling(next_sibling); | |
| } | |
| if (!hydrating) { | |
| return next_sibling; | |
| } | |
| if (is_text) { | |
| if (next_sibling?.nodeType !== TEXT_NODE) { | |
| var text2 = create_text(); | |
| if (next_sibling === null) { | |
| last_sibling?.after(text2); | |
| } else { | |
| next_sibling.before(text2); | |
| } | |
| set_hydrate_node(text2); | |
| return text2; | |
| } | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| next_sibling | |
| ); | |
| } | |
| set_hydrate_node(next_sibling); | |
| return next_sibling; | |
| } | |
| function clear_text_content(node) { | |
| node.textContent = ""; | |
| } | |
| function should_defer_append() { | |
| return false; | |
| } | |
| function create_element(tag, namespace, is2) { | |
| let options = void 0; | |
| return ( | |
| /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ | |
| document.createElementNS(namespace ?? NAMESPACE_HTML, tag, options) | |
| ); | |
| } | |
| function merge_text_nodes(text2) { | |
| if ( | |
| /** @type {string} */ | |
| text2.nodeValue.length < 65536 | |
| ) { | |
| return; | |
| } | |
| let next2 = text2.nextSibling; | |
| while (next2 !== null && next2.nodeType === TEXT_NODE) { | |
| next2.remove(); | |
| text2.nodeValue += /** @type {string} */ | |
| next2.nodeValue; | |
| next2 = text2.nextSibling; | |
| } | |
| } | |
| function handle_error(error) { | |
| var effect2 = active_effect; | |
| if (effect2 === null) { | |
| active_reaction.f |= ERROR_VALUE; | |
| return error; | |
| } | |
| if ((effect2.f & REACTION_RAN) === 0 && (effect2.f & EFFECT) === 0) { | |
| throw error; | |
| } | |
| invoke_error_boundary(error, effect2); | |
| } | |
| function invoke_error_boundary(error, effect2) { | |
| while (effect2 !== null) { | |
| if ((effect2.f & BOUNDARY_EFFECT) !== 0) { | |
| if ((effect2.f & REACTION_RAN) === 0) { | |
| throw error; | |
| } | |
| try { | |
| effect2.b.error(error); | |
| return; | |
| } catch (e) { | |
| error = e; | |
| } | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| throw error; | |
| } | |
| const STATUS_MASK = -7169; | |
| function set_signal_status(signal, status) { | |
| signal.f = signal.f & STATUS_MASK | status; | |
| } | |
| function update_derived_status(derived2) { | |
| if ((derived2.f & CONNECTED) !== 0 || derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| } else { | |
| set_signal_status(derived2, MAYBE_DIRTY); | |
| } | |
| } | |
| function clear_marked(deps) { | |
| if (deps === null) return; | |
| for (const dep of deps) { | |
| if ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) { | |
| continue; | |
| } | |
| dep.f ^= WAS_MARKED; | |
| clear_marked( | |
| /** @type {Derived} */ | |
| dep.deps | |
| ); | |
| } | |
| } | |
| function defer_effect(effect2, dirty_effects, maybe_dirty_effects) { | |
| if ((effect2.f & DIRTY) !== 0) { | |
| dirty_effects.add(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| maybe_dirty_effects.add(effect2); | |
| } | |
| clear_marked(effect2.deps); | |
| set_signal_status(effect2, CLEAN); | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set2(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set2(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set2, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set: set2, update, subscribe }; | |
| } | |
| function get$1(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let IS_UNMOUNTED = /* @__PURE__ */ Symbol("unmounted"); | |
| function store_get(store2, store_name, stores) { | |
| const entry = stores[store_name] ??= { | |
| store: null, | |
| source: /* @__PURE__ */ mutable_source(void 0), | |
| unsubscribe: noop | |
| }; | |
| if (entry.store !== store2 && !(IS_UNMOUNTED in stores)) { | |
| entry.unsubscribe(); | |
| entry.store = store2 ?? null; | |
| if (store2 == null) { | |
| entry.source.v = void 0; | |
| entry.unsubscribe = noop; | |
| } else { | |
| var is_synchronous_callback = true; | |
| entry.unsubscribe = subscribe_to_store(store2, (v) => { | |
| if (is_synchronous_callback) { | |
| entry.source.v = v; | |
| } else { | |
| set(entry.source, v); | |
| } | |
| }); | |
| is_synchronous_callback = false; | |
| } | |
| } | |
| if (store2 && IS_UNMOUNTED in stores) { | |
| return get$1(store2); | |
| } | |
| return get(entry.source); | |
| } | |
| function setup_stores() { | |
| const stores = {}; | |
| function cleanup() { | |
| teardown(() => { | |
| for (var store_name in stores) { | |
| const ref = stores[store_name]; | |
| ref.unsubscribe(); | |
| } | |
| define_property(stores, IS_UNMOUNTED, { | |
| enumerable: false, | |
| value: true | |
| }); | |
| }); | |
| } | |
| return [stores, cleanup]; | |
| } | |
| let first_batch = null; | |
| let last_batch = null; | |
| let current_batch = null; | |
| let previous_batch = null; | |
| let batch_values = null; | |
| let last_scheduled_effect = null; | |
| let is_flushing_sync = false; | |
| let is_processing = false; | |
| let collected_effects = null; | |
| let legacy_updates = null; | |
| var flush_count = 0; | |
| var source_stacks = /* @__PURE__ */ new Set(); | |
| let uid = 1; | |
| class Batch { | |
| id = uid++; | |
| /** True as soon as `#process` was called */ | |
| #started = false; | |
| linked = true; | |
| /** @type {Batch | null} */ | |
| #prev = null; | |
| /** @type {Batch | null} */ | |
| #next = null; | |
| /** @type {Map<Effect, ReturnType<typeof deferred<any>>>} */ | |
| async_deriveds = /* @__PURE__ */ new Map(); | |
| /** | |
| * The current values of any signals that are updated in this batch. | |
| * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment) | |
| * They keys of this map are identical to `this.#previous` | |
| * @type {Map<Value, [any, boolean]>} | |
| */ | |
| current = /* @__PURE__ */ new Map(); | |
| /** | |
| * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place. | |
| * They keys of this map are identical to `this.#current` | |
| * @type {Map<Value, any>} | |
| */ | |
| previous = /* @__PURE__ */ new Map(); | |
| /** | |
| * Async effects which this batch doesn't take into account anymore when calculating blockers, | |
| * as it has a value for it already. | |
| * @type {Set<Effect>} | |
| */ | |
| unblocked = /* @__PURE__ */ new Set(); | |
| /** | |
| * When the batch is committed (and the DOM is updated), we need to remove old branches | |
| * and append new ones by calling the functions added inside (if/each/key/etc) blocks | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * If a fork is discarded, we need to destroy any effects that are no longer needed | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #discard_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * Callbacks that should run only when a fork is committed. | |
| * @type {Set<(batch: Batch) => void>} | |
| */ | |
| #fork_commit_callbacks = /* @__PURE__ */ new Set(); | |
| /** | |
| * The number of async effects that are currently in flight | |
| */ | |
| #pending = 0; | |
| /** | |
| * Async effects that are currently in flight, _not_ inside a pending boundary | |
| * @type {Map<Effect, number>} | |
| */ | |
| #blocking_pending = /* @__PURE__ */ new Map(); | |
| /** | |
| * A deferred that resolves when the batch is committed, used with `settled()` | |
| * TODO replace with Promise.withResolvers once supported widely enough | |
| * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null} | |
| */ | |
| #deferred = null; | |
| /** | |
| * The root effects that need to be flushed | |
| * @type {Effect[]} | |
| */ | |
| #roots = []; | |
| /** | |
| * Effects created while this batch was active. | |
| * @type {Effect[]} | |
| */ | |
| #new_effects = []; | |
| /** | |
| * Deferred effects (which run after async work has completed) that are DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * Deferred effects that are MAYBE_DIRTY | |
| * @type {Set<Effect>} | |
| */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A map of branches that still exist, but will be destroyed when this batch | |
| * is committed — we skip over these during `process`. | |
| * The value contains child effects that were dirty/maybe_dirty before being reset, | |
| * so they can be rescheduled if the branch survives. | |
| * @type {Map<Effect, { d: Effect[], m: Effect[] }>} | |
| */ | |
| #skipped_branches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing | |
| * @type {Set<Effect>} | |
| */ | |
| #unskipped_branches = /* @__PURE__ */ new Set(); | |
| is_fork = false; | |
| #decrement_queued = false; | |
| #is_deferred() { | |
| if (this.is_fork) return true; | |
| for (const effect2 of this.#blocking_pending.keys()) { | |
| var e = effect2; | |
| var skipped = false; | |
| while (e.parent !== null) { | |
| if (this.#skipped_branches.has(e)) { | |
| skipped = true; | |
| break; | |
| } | |
| e = e.parent; | |
| } | |
| if (!skipped) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| /** | |
| * Add an effect to the #skipped_branches map and reset its children | |
| * @param {Effect} effect | |
| */ | |
| skip_effect(effect2) { | |
| if (!this.#skipped_branches.has(effect2)) { | |
| this.#skipped_branches.set(effect2, { d: [], m: [] }); | |
| } | |
| this.#unskipped_branches.delete(effect2); | |
| } | |
| /** | |
| * Remove an effect from the #skipped_branches map and reschedule | |
| * any tracked dirty/maybe_dirty child effects | |
| * @param {Effect} effect | |
| * @param {(e: Effect) => void} callback | |
| */ | |
| unskip_effect(effect2, callback = (e) => this.schedule(e)) { | |
| var tracked = this.#skipped_branches.get(effect2); | |
| if (tracked) { | |
| this.#skipped_branches.delete(effect2); | |
| for (var e of tracked.d) { | |
| set_signal_status(e, DIRTY); | |
| callback(e); | |
| } | |
| for (e of tracked.m) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| callback(e); | |
| } | |
| } | |
| this.#unskipped_branches.add(effect2); | |
| } | |
| #process() { | |
| this.#started = true; | |
| if (flush_count++ > 1e3) { | |
| this.#unlink(); | |
| infinite_loop_guard(); | |
| } | |
| if (!this.#is_deferred()) { | |
| for (const e of this.#dirty_effects) { | |
| this.#maybe_dirty_effects.delete(e); | |
| set_signal_status(e, DIRTY); | |
| this.schedule(e); | |
| } | |
| for (const e of this.#maybe_dirty_effects) { | |
| set_signal_status(e, MAYBE_DIRTY); | |
| this.schedule(e); | |
| } | |
| } | |
| const roots = this.#roots; | |
| this.#roots = []; | |
| this.apply(); | |
| var effects = collected_effects = []; | |
| var render_effects = []; | |
| var updates = legacy_updates = []; | |
| for (const root2 of roots) { | |
| try { | |
| this.#traverse(root2, effects, render_effects); | |
| } catch (e) { | |
| reset_all(root2); | |
| throw e; | |
| } | |
| } | |
| current_batch = null; | |
| if (updates.length > 0) { | |
| var batch = Batch.ensure(); | |
| for (const e of updates) { | |
| batch.schedule(e); | |
| } | |
| } | |
| collected_effects = null; | |
| legacy_updates = null; | |
| if (this.#is_deferred()) { | |
| this.#defer_effects(render_effects); | |
| this.#defer_effects(effects); | |
| for (const [e, t] of this.#skipped_branches) { | |
| reset_branch(e, t); | |
| } | |
| if (updates.length > 0) { | |
| /** @type {unknown} */ | |
| current_batch.#process(); | |
| } | |
| return; | |
| } | |
| const earlier_batch = this.#find_earlier_batch(); | |
| if (earlier_batch) { | |
| earlier_batch.#merge(this); | |
| return; | |
| } | |
| this.#dirty_effects.clear(); | |
| this.#maybe_dirty_effects.clear(); | |
| for (const fn of this.#commit_callbacks) fn(this); | |
| this.#commit_callbacks.clear(); | |
| previous_batch = this; | |
| flush_queued_effects(render_effects); | |
| flush_queued_effects(effects); | |
| previous_batch = null; | |
| this.#deferred?.resolve(); | |
| var next_batch = ( | |
| /** @type {Batch | null} */ | |
| /** @type {unknown} */ | |
| current_batch | |
| ); | |
| if (this.linked && this.#pending === 0) { | |
| this.#unlink(); | |
| } | |
| if (this.#roots.length > 0) { | |
| if (next_batch === null) { | |
| next_batch = this; | |
| this.#link(); | |
| } | |
| const batch2 = next_batch; | |
| batch2.#roots.push(...this.#roots.filter((r2) => !batch2.#roots.includes(r2))); | |
| } | |
| if (next_batch !== null) { | |
| next_batch.#process(); | |
| } | |
| } | |
| /** | |
| * Traverse the effect tree, executing effects or stashing | |
| * them for later execution as appropriate | |
| * @param {Effect} root | |
| * @param {Effect[]} effects | |
| * @param {Effect[]} render_effects | |
| */ | |
| #traverse(root2, effects, render_effects) { | |
| root2.f ^= CLEAN; | |
| var effect2 = root2.first; | |
| while (effect2 !== null) { | |
| var flags2 = effect2.f; | |
| var is_branch = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0; | |
| var is_skippable_branch = is_branch && (flags2 & CLEAN) !== 0; | |
| var skip = is_skippable_branch || (flags2 & INERT) !== 0 || this.#skipped_branches.has(effect2); | |
| if (!skip && effect2.fn !== null) { | |
| if (is_branch) { | |
| effect2.f ^= CLEAN; | |
| } else if ((flags2 & EFFECT) !== 0) { | |
| effects.push(effect2); | |
| } else if (is_dirty(effect2)) { | |
| if ((flags2 & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect2); | |
| update_effect(effect2); | |
| } | |
| var child2 = effect2.first; | |
| if (child2 !== null) { | |
| effect2 = child2; | |
| continue; | |
| } | |
| } | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if (next2 !== null) { | |
| effect2 = next2; | |
| break; | |
| } | |
| effect2 = effect2.parent; | |
| } | |
| } | |
| } | |
| #find_earlier_batch() { | |
| var batch = this.#prev; | |
| while (batch !== null) { | |
| if (!batch.is_fork) { | |
| for (const [value, [, is_derived]] of this.current) { | |
| if (batch.current.has(value) && !is_derived) { | |
| return batch; | |
| } | |
| } | |
| } | |
| batch = batch.#prev; | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #merge(batch) { | |
| for (const [source2, value] of batch.current) { | |
| if (!this.previous.has(source2) && batch.previous.has(source2)) { | |
| this.previous.set(source2, batch.previous.get(source2)); | |
| } | |
| this.current.set(source2, value); | |
| } | |
| for (const [effect2, deferred2] of batch.async_deriveds) { | |
| const d = this.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| const mark = (value) => { | |
| var reactions = value.reactions; | |
| if (reactions === null) return; | |
| for (const reaction of reactions) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| } else { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if (flags2 & (ASYNC | BLOCK_EFFECT) && !this.async_deriveds.has(effect2)) { | |
| this.#maybe_dirty_effects.delete(effect2); | |
| set_signal_status(effect2, DIRTY); | |
| this.schedule(effect2); | |
| } | |
| } | |
| } | |
| }; | |
| for (const source2 of this.current.keys()) { | |
| mark(source2); | |
| } | |
| this.oncommit(() => batch.discard()); | |
| batch.#unlink(); | |
| current_batch = this; | |
| this.#process(); | |
| } | |
| /** | |
| * @param {Effect[]} effects | |
| */ | |
| #defer_effects(effects) { | |
| for (var i = 0; i < effects.length; i += 1) { | |
| defer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| } | |
| /** | |
| * Associate a change to a given source with the current | |
| * batch, noting its previous and current values | |
| * @param {Value} source | |
| * @param {any} value | |
| * @param {boolean} [is_derived] | |
| */ | |
| capture(source2, value, is_derived = false) { | |
| if (source2.v !== UNINITIALIZED && !this.previous.has(source2)) { | |
| this.previous.set(source2, source2.v); | |
| } | |
| if ((source2.f & ERROR_VALUE) === 0) { | |
| this.current.set(source2, [value, is_derived]); | |
| batch_values?.set(source2, value); | |
| } | |
| if (!this.is_fork) { | |
| source2.v = value; | |
| } | |
| } | |
| activate() { | |
| current_batch = this; | |
| } | |
| deactivate() { | |
| current_batch = null; | |
| batch_values = null; | |
| } | |
| flush() { | |
| try { | |
| if (DEV) ; | |
| is_processing = true; | |
| current_batch = this; | |
| this.#process(); | |
| } finally { | |
| flush_count = 0; | |
| last_scheduled_effect = null; | |
| collected_effects = null; | |
| legacy_updates = null; | |
| is_processing = false; | |
| current_batch = null; | |
| batch_values = null; | |
| old_values.clear(); | |
| } | |
| } | |
| discard() { | |
| for (const fn of this.#discard_callbacks) fn(this); | |
| this.#discard_callbacks.clear(); | |
| this.#fork_commit_callbacks.clear(); | |
| this.#unlink(); | |
| } | |
| /** | |
| * @param {Effect} effect | |
| */ | |
| register_created_effect(effect2) { | |
| this.#new_effects.push(effect2); | |
| } | |
| #commit() { | |
| this.#unlink(); | |
| for (let batch = first_batch; batch !== null; batch = batch.#next) { | |
| var is_earlier = batch.id < this.id; | |
| var sources = []; | |
| for (const [source3, [value, is_derived]] of this.current) { | |
| if (batch.current.has(source3)) { | |
| var batch_value = ( | |
| /** @type {[any, boolean]} */ | |
| batch.current.get(source3)[0] | |
| ); | |
| if (is_earlier && value !== batch_value) { | |
| batch.current.set(source3, [value, is_derived]); | |
| } else { | |
| continue; | |
| } | |
| } | |
| sources.push(source3); | |
| } | |
| if (is_earlier) { | |
| for (const [effect2, deferred2] of this.async_deriveds) { | |
| const d = batch.async_deriveds.get(effect2); | |
| if (d) deferred2.promise.then(d.resolve); | |
| } | |
| } | |
| if (!batch.#started) continue; | |
| var others = [...batch.current.keys()].filter((s) => !this.current.has(s)); | |
| if (others.length === 0) { | |
| if (is_earlier) { | |
| batch.discard(); | |
| } | |
| } else if (sources.length > 0) { | |
| if (is_earlier) { | |
| for (const unskipped of this.#unskipped_branches) { | |
| batch.unskip_effect(unskipped, (e) => { | |
| if ((e.f & (BLOCK_EFFECT | ASYNC)) !== 0) { | |
| batch.schedule(e); | |
| } else { | |
| batch.#defer_effects([e]); | |
| } | |
| }); | |
| } | |
| } | |
| batch.activate(); | |
| var marked = /* @__PURE__ */ new Set(); | |
| var checked = /* @__PURE__ */ new Map(); | |
| for (var source2 of sources) { | |
| mark_effects(source2, others, marked, checked); | |
| } | |
| checked = /* @__PURE__ */ new Map(); | |
| var current_unequal = [...batch.current.keys()].filter( | |
| (c) => this.current.has(c) ? ( | |
| /** @type {[any, boolean]} */ | |
| this.current.get(c)[0] !== c.v | |
| ) : true | |
| ); | |
| if (current_unequal.length > 0) { | |
| for (const effect2 of this.#new_effects) { | |
| if ((effect2.f & (DESTROYED | INERT | EAGER_EFFECT)) === 0 && depends_on(effect2, current_unequal, checked)) { | |
| if ((effect2.f & (ASYNC | BLOCK_EFFECT)) !== 0) { | |
| set_signal_status(effect2, DIRTY); | |
| batch.schedule(effect2); | |
| } else { | |
| batch.#dirty_effects.add(effect2); | |
| } | |
| } | |
| } | |
| } | |
| if (batch.#roots.length > 0) { | |
| batch.apply(); | |
| for (var root2 of batch.#roots) { | |
| batch.#traverse(root2, [], []); | |
| } | |
| batch.#roots = []; | |
| } | |
| batch.deactivate(); | |
| } | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| increment(blocking, effect2) { | |
| this.#pending += 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| this.#blocking_pending.set(effect2, blocking_pending_count + 1); | |
| } | |
| } | |
| /** | |
| * @param {boolean} blocking | |
| * @param {Effect} effect | |
| */ | |
| decrement(blocking, effect2) { | |
| this.#pending -= 1; | |
| if (blocking) { | |
| let blocking_pending_count = this.#blocking_pending.get(effect2) ?? 0; | |
| if (blocking_pending_count === 1) { | |
| this.#blocking_pending.delete(effect2); | |
| } else { | |
| this.#blocking_pending.set(effect2, blocking_pending_count - 1); | |
| } | |
| } | |
| if (this.#decrement_queued) return; | |
| this.#decrement_queued = true; | |
| queue_micro_task(() => { | |
| this.#decrement_queued = false; | |
| if (this.linked) { | |
| this.flush(); | |
| } | |
| }); | |
| } | |
| /** | |
| * @param {Set<Effect>} dirty_effects | |
| * @param {Set<Effect>} maybe_dirty_effects | |
| */ | |
| transfer_effects(dirty_effects, maybe_dirty_effects) { | |
| for (const e of dirty_effects) { | |
| this.#dirty_effects.add(e); | |
| } | |
| for (const e of maybe_dirty_effects) { | |
| this.#maybe_dirty_effects.add(e); | |
| } | |
| dirty_effects.clear(); | |
| maybe_dirty_effects.clear(); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| oncommit(fn) { | |
| this.#commit_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| ondiscard(fn) { | |
| this.#discard_callbacks.add(fn); | |
| } | |
| /** @param {(batch: Batch) => void} fn */ | |
| on_fork_commit(fn) { | |
| this.#fork_commit_callbacks.add(fn); | |
| } | |
| run_fork_commit_callbacks() { | |
| for (const fn of this.#fork_commit_callbacks) fn(this); | |
| this.#fork_commit_callbacks.clear(); | |
| } | |
| settled() { | |
| return (this.#deferred ??= deferred()).promise; | |
| } | |
| static ensure() { | |
| if (current_batch === null) { | |
| const batch = current_batch = new Batch(); | |
| batch.#link(); | |
| if (!is_processing && !is_flushing_sync) { | |
| queue_micro_task(() => { | |
| if (!batch.#started) { | |
| batch.flush(); | |
| } | |
| }); | |
| } | |
| } | |
| return current_batch; | |
| } | |
| apply() { | |
| { | |
| batch_values = null; | |
| return; | |
| } | |
| } | |
| /** | |
| * | |
| * @param {Effect} effect | |
| */ | |
| schedule(effect2) { | |
| last_scheduled_effect = effect2; | |
| if (effect2.b?.is_pending && (effect2.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 && (effect2.f & REACTION_RAN) === 0) { | |
| effect2.b.defer_effect(effect2); | |
| return; | |
| } | |
| var e = effect2; | |
| while (e.parent !== null) { | |
| e = e.parent; | |
| var flags2 = e.f; | |
| if (collected_effects !== null && e === active_effect) { | |
| if ((active_reaction === null || (active_reaction.f & DERIVED) === 0) && true) { | |
| return; | |
| } | |
| } | |
| if ((flags2 & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { | |
| if ((flags2 & CLEAN) === 0) { | |
| return; | |
| } | |
| e.f ^= CLEAN; | |
| } | |
| } | |
| this.#roots.push(e); | |
| } | |
| #link() { | |
| if (last_batch === null) { | |
| first_batch = last_batch = this; | |
| } else { | |
| last_batch.#next = this; | |
| this.#prev = last_batch; | |
| } | |
| last_batch = this; | |
| } | |
| #unlink() { | |
| var prev = this.#prev; | |
| var next2 = this.#next; | |
| if (prev === null) { | |
| first_batch = next2; | |
| } else { | |
| prev.#next = next2; | |
| } | |
| if (next2 === null) { | |
| last_batch = prev; | |
| } else { | |
| next2.#prev = prev; | |
| } | |
| this.linked = false; | |
| } | |
| } | |
| function flushSync(fn) { | |
| var was_flushing_sync = is_flushing_sync; | |
| is_flushing_sync = true; | |
| try { | |
| var result; | |
| if (fn) ; | |
| while (true) { | |
| flush_tasks(); | |
| if (current_batch === null) { | |
| return ( | |
| /** @type {T} */ | |
| result | |
| ); | |
| } | |
| current_batch.flush(); | |
| } | |
| } finally { | |
| is_flushing_sync = was_flushing_sync; | |
| } | |
| } | |
| function infinite_loop_guard() { | |
| try { | |
| effect_update_depth_exceeded(); | |
| } catch (error) { | |
| invoke_error_boundary(error, last_scheduled_effect); | |
| } | |
| } | |
| let eager_block_effects = null; | |
| function flush_queued_effects(effects) { | |
| var length = effects.length; | |
| if (length === 0) return; | |
| var i = 0; | |
| while (i < length) { | |
| var effect2 = effects[i++]; | |
| if ((effect2.f & (DESTROYED | INERT)) === 0 && is_dirty(effect2)) { | |
| eager_block_effects = /* @__PURE__ */ new Set(); | |
| update_effect(effect2); | |
| if (effect2.deps === null && effect2.first === null && effect2.nodes === null && effect2.teardown === null && effect2.ac === null) { | |
| unlink_effect(effect2); | |
| } | |
| if (eager_block_effects?.size > 0) { | |
| old_values.clear(); | |
| for (const e of eager_block_effects) { | |
| if ((e.f & (DESTROYED | INERT)) !== 0) continue; | |
| const ordered_effects = [e]; | |
| let ancestor = e.parent; | |
| while (ancestor !== null) { | |
| if (eager_block_effects.has(ancestor)) { | |
| eager_block_effects.delete(ancestor); | |
| ordered_effects.push(ancestor); | |
| } | |
| ancestor = ancestor.parent; | |
| } | |
| for (let j = ordered_effects.length - 1; j >= 0; j--) { | |
| const e2 = ordered_effects[j]; | |
| if ((e2.f & (DESTROYED | INERT)) !== 0) continue; | |
| update_effect(e2); | |
| } | |
| } | |
| eager_block_effects.clear(); | |
| } | |
| } | |
| } | |
| eager_block_effects = null; | |
| } | |
| function mark_effects(value, sources, marked, checked) { | |
| if (marked.has(value)) return; | |
| marked.add(value); | |
| if (value.reactions !== null) { | |
| for (const reaction of value.reactions) { | |
| const flags2 = reaction.f; | |
| if ((flags2 & DERIVED) !== 0) { | |
| mark_effects( | |
| /** @type {Derived} */ | |
| reaction, | |
| sources, | |
| marked, | |
| checked | |
| ); | |
| } else if ((flags2 & (ASYNC | BLOCK_EFFECT)) !== 0 && (flags2 & DIRTY) === 0 && depends_on(reaction, sources, checked)) { | |
| set_signal_status(reaction, DIRTY); | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| function depends_on(reaction, sources, checked) { | |
| const depends = checked.get(reaction); | |
| if (depends !== void 0) return depends; | |
| if (reaction.deps !== null) { | |
| for (const dep of reaction.deps) { | |
| if (includes.call(sources, dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on( | |
| /** @type {Derived} */ | |
| dep, | |
| sources, | |
| checked | |
| )) { | |
| checked.set( | |
| /** @type {Derived} */ | |
| dep, | |
| true | |
| ); | |
| return true; | |
| } | |
| } | |
| } | |
| checked.set(reaction, false); | |
| return false; | |
| } | |
| function schedule_effect(effect2) { | |
| current_batch.schedule(effect2); | |
| } | |
| function reset_branch(effect2, tracked) { | |
| if ((effect2.f & BRANCH_EFFECT) !== 0 && (effect2.f & CLEAN) !== 0) { | |
| return; | |
| } | |
| if ((effect2.f & DIRTY) !== 0) { | |
| tracked.d.push(effect2); | |
| } else if ((effect2.f & MAYBE_DIRTY) !== 0) { | |
| tracked.m.push(effect2); | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_branch(e, tracked); | |
| e = e.next; | |
| } | |
| } | |
| function reset_all(effect2) { | |
| set_signal_status(effect2, CLEAN); | |
| var e = effect2.first; | |
| while (e !== null) { | |
| reset_all(e); | |
| e = e.next; | |
| } | |
| } | |
| function createSubscriber(start) { | |
| let subscribers = 0; | |
| let version = source(0); | |
| let stop; | |
| return () => { | |
| if (effect_tracking()) { | |
| get(version); | |
| render_effect(() => { | |
| if (subscribers === 0) { | |
| stop = untrack(() => start(() => increment(version))); | |
| } | |
| subscribers += 1; | |
| return () => { | |
| queue_micro_task(() => { | |
| subscribers -= 1; | |
| if (subscribers === 0) { | |
| stop?.(); | |
| stop = void 0; | |
| increment(version); | |
| } | |
| }); | |
| }; | |
| }); | |
| } | |
| }; | |
| } | |
| var flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED; | |
| function boundary(node, props, children, transform_error) { | |
| new Boundary(node, props, children, transform_error); | |
| } | |
| class Boundary { | |
| /** @type {Boundary | null} */ | |
| parent; | |
| is_pending = false; | |
| /** | |
| * API-level transformError transform function. Transforms errors before they reach the `failed` snippet. | |
| * Inherited from parent boundary, or defaults to identity. | |
| * @type {(error: unknown) => unknown} | |
| */ | |
| transform_error; | |
| /** @type {TemplateNode} */ | |
| #anchor; | |
| /** @type {TemplateNode | null} */ | |
| #hydrate_open = hydrating ? hydrate_node : null; | |
| /** @type {BoundaryProps} */ | |
| #props; | |
| /** @type {((anchor: Node) => void)} */ | |
| #children; | |
| /** @type {Effect} */ | |
| #effect; | |
| /** @type {Effect | null} */ | |
| #main_effect = null; | |
| /** @type {Effect | null} */ | |
| #pending_effect = null; | |
| /** @type {Effect | null} */ | |
| #failed_effect = null; | |
| /** @type {DocumentFragment | null} */ | |
| #offscreen_fragment = null; | |
| #local_pending_count = 0; | |
| #pending_count = 0; | |
| #pending_count_update_queued = false; | |
| /** @type {Set<Effect>} */ | |
| #dirty_effects = /* @__PURE__ */ new Set(); | |
| /** @type {Set<Effect>} */ | |
| #maybe_dirty_effects = /* @__PURE__ */ new Set(); | |
| /** | |
| * A source containing the number of pending async deriveds/expressions. | |
| * Only created if `$effect.pending()` is used inside the boundary, | |
| * otherwise updating the source results in needless `Batch.ensure()` | |
| * calls followed by no-op flushes | |
| * @type {Source<number> | null} | |
| */ | |
| #effect_pending = null; | |
| #effect_pending_subscriber = createSubscriber(() => { | |
| this.#effect_pending = source(this.#local_pending_count); | |
| return () => { | |
| this.#effect_pending = null; | |
| }; | |
| }); | |
| /** | |
| * @param {TemplateNode} node | |
| * @param {BoundaryProps} props | |
| * @param {((anchor: Node) => void)} children | |
| * @param {((error: unknown) => unknown) | undefined} [transform_error] | |
| */ | |
| constructor(node, props, children, transform_error) { | |
| this.#anchor = node; | |
| this.#props = props; | |
| this.#children = (anchor) => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| children(anchor); | |
| }; | |
| this.parent = /** @type {Effect} */ | |
| active_effect.b; | |
| this.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e); | |
| this.#effect = block(() => { | |
| if (hydrating) { | |
| const comment2 = ( | |
| /** @type {Comment} */ | |
| this.#hydrate_open | |
| ); | |
| hydrate_next(); | |
| const server_rendered_pending = comment2.data === HYDRATION_START_ELSE; | |
| const server_rendered_failed = comment2.data.startsWith(HYDRATION_START_FAILED); | |
| if (server_rendered_failed) { | |
| const serialized_error = JSON.parse(comment2.data.slice(HYDRATION_START_FAILED.length)); | |
| this.#hydrate_failed_content(serialized_error); | |
| } else if (server_rendered_pending) { | |
| this.#hydrate_pending_content(); | |
| } else { | |
| this.#hydrate_resolved_content(); | |
| } | |
| } else { | |
| this.#render(); | |
| } | |
| }, flags); | |
| if (hydrating) { | |
| this.#anchor = hydrate_node; | |
| } | |
| } | |
| #hydrate_resolved_content() { | |
| try { | |
| this.#main_effect = branch(() => this.#children(this.#anchor)); | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error The deserialized error from the server's hydration comment | |
| */ | |
| #hydrate_failed_content(error) { | |
| const failed = this.#props.failed; | |
| if (!failed) return; | |
| this.#failed_effect = branch(() => { | |
| failed( | |
| this.#anchor, | |
| () => error, | |
| () => () => { | |
| } | |
| ); | |
| }); | |
| } | |
| #hydrate_pending_content() { | |
| const pending = this.#props.pending; | |
| if (!pending) return; | |
| this.is_pending = true; | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| queue_micro_task(() => { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| var anchor = create_text(); | |
| fragment.append(anchor); | |
| this.#main_effect = this.#run(() => { | |
| return branch(() => this.#children(anchor)); | |
| }); | |
| if (this.#pending_count === 0) { | |
| this.#anchor.before(fragment); | |
| this.#offscreen_fragment = null; | |
| pause_effect( | |
| /** @type {Effect} */ | |
| this.#pending_effect, | |
| () => { | |
| this.#pending_effect = null; | |
| } | |
| ); | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| }); | |
| } | |
| #render() { | |
| try { | |
| this.is_pending = this.has_pending_snippet(); | |
| this.#pending_count = 0; | |
| this.#local_pending_count = 0; | |
| this.#main_effect = branch(() => { | |
| this.#children(this.#anchor); | |
| }); | |
| if (this.#pending_count > 0) { | |
| var fragment = this.#offscreen_fragment = document.createDocumentFragment(); | |
| move_effect(this.#main_effect, fragment); | |
| const pending = ( | |
| /** @type {(anchor: Node) => void} */ | |
| this.#props.pending | |
| ); | |
| this.#pending_effect = branch(() => pending(this.#anchor)); | |
| } else { | |
| this.#resolve( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| } | |
| } catch (error) { | |
| this.error(error); | |
| } | |
| } | |
| /** | |
| * @param {Batch} batch | |
| */ | |
| #resolve(batch) { | |
| this.is_pending = false; | |
| batch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Defer an effect inside a pending boundary until the boundary resolves | |
| * @param {Effect} effect | |
| */ | |
| defer_effect(effect2) { | |
| defer_effect(effect2, this.#dirty_effects, this.#maybe_dirty_effects); | |
| } | |
| /** | |
| * Returns `false` if the effect exists inside a boundary whose pending snippet is shown | |
| * @returns {boolean} | |
| */ | |
| is_rendered() { | |
| return !this.is_pending && (!this.parent || this.parent.is_rendered()); | |
| } | |
| has_pending_snippet() { | |
| return !!this.#props.pending; | |
| } | |
| /** | |
| * @template T | |
| * @param {() => T} fn | |
| */ | |
| #run(fn) { | |
| var previous_effect = active_effect; | |
| var previous_reaction = active_reaction; | |
| var previous_ctx = component_context; | |
| set_active_effect(this.#effect); | |
| set_active_reaction(this.#effect); | |
| set_component_context(this.#effect.ctx); | |
| try { | |
| Batch.ensure(); | |
| return fn(); | |
| } catch (e) { | |
| handle_error(e); | |
| return null; | |
| } finally { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_ctx); | |
| } | |
| } | |
| /** | |
| * Updates the pending count associated with the currently visible pending snippet, | |
| * if any, such that we can replace the snippet with content once work is done | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| #update_pending_count(d, batch) { | |
| if (!this.has_pending_snippet()) { | |
| if (this.parent) { | |
| this.parent.#update_pending_count(d, batch); | |
| } | |
| return; | |
| } | |
| this.#pending_count += d; | |
| if (this.#pending_count === 0) { | |
| this.#resolve(batch); | |
| if (this.#pending_effect) { | |
| pause_effect(this.#pending_effect, () => { | |
| this.#pending_effect = null; | |
| }); | |
| } | |
| if (this.#offscreen_fragment) { | |
| this.#anchor.before(this.#offscreen_fragment); | |
| this.#offscreen_fragment = null; | |
| } | |
| } | |
| } | |
| /** | |
| * Update the source that powers `$effect.pending()` inside this boundary, | |
| * and controls when the current `pending` snippet (if any) is removed. | |
| * Do not call from inside the class | |
| * @param {1 | -1} d | |
| * @param {Batch} batch | |
| */ | |
| update_pending_count(d, batch) { | |
| this.#update_pending_count(d, batch); | |
| this.#local_pending_count += d; | |
| if (!this.#effect_pending || this.#pending_count_update_queued) return; | |
| this.#pending_count_update_queued = true; | |
| queue_micro_task(() => { | |
| this.#pending_count_update_queued = false; | |
| if (this.#effect_pending) { | |
| internal_set(this.#effect_pending, this.#local_pending_count); | |
| } | |
| }); | |
| } | |
| get_effect_pending() { | |
| this.#effect_pending_subscriber(); | |
| return get( | |
| /** @type {Source<number>} */ | |
| this.#effect_pending | |
| ); | |
| } | |
| /** @param {unknown} error */ | |
| error(error) { | |
| if (!this.#props.onerror && !this.#props.failed) { | |
| throw error; | |
| } | |
| if (current_batch?.is_fork) { | |
| if (this.#main_effect) current_batch.skip_effect(this.#main_effect); | |
| if (this.#pending_effect) current_batch.skip_effect(this.#pending_effect); | |
| if (this.#failed_effect) current_batch.skip_effect(this.#failed_effect); | |
| current_batch.on_fork_commit(() => { | |
| this.#handle_error(error); | |
| }); | |
| } else { | |
| this.#handle_error(error); | |
| } | |
| } | |
| /** | |
| * @param {unknown} error | |
| */ | |
| #handle_error(error) { | |
| if (this.#main_effect) { | |
| destroy_effect(this.#main_effect); | |
| this.#main_effect = null; | |
| } | |
| if (this.#pending_effect) { | |
| destroy_effect(this.#pending_effect); | |
| this.#pending_effect = null; | |
| } | |
| if (this.#failed_effect) { | |
| destroy_effect(this.#failed_effect); | |
| this.#failed_effect = null; | |
| } | |
| if (hydrating) { | |
| set_hydrate_node( | |
| /** @type {TemplateNode} */ | |
| this.#hydrate_open | |
| ); | |
| next(); | |
| set_hydrate_node(skip_nodes()); | |
| } | |
| var onerror = this.#props.onerror; | |
| let failed = this.#props.failed; | |
| var did_reset = false; | |
| var calling_on_error = false; | |
| const reset2 = () => { | |
| if (did_reset) { | |
| svelte_boundary_reset_noop(); | |
| return; | |
| } | |
| did_reset = true; | |
| if (calling_on_error) { | |
| svelte_boundary_reset_onerror(); | |
| } | |
| if (this.#failed_effect !== null) { | |
| pause_effect(this.#failed_effect, () => { | |
| this.#failed_effect = null; | |
| }); | |
| } | |
| this.#run(() => { | |
| this.#render(); | |
| }); | |
| }; | |
| const handle_error_result = (transformed_error) => { | |
| try { | |
| calling_on_error = true; | |
| onerror?.(transformed_error, reset2); | |
| calling_on_error = false; | |
| } catch (error2) { | |
| invoke_error_boundary(error2, this.#effect && this.#effect.parent); | |
| } | |
| if (failed) { | |
| this.#failed_effect = this.#run(() => { | |
| try { | |
| return branch(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| effect2.b = this; | |
| effect2.f |= BOUNDARY_EFFECT; | |
| failed( | |
| this.#anchor, | |
| () => transformed_error, | |
| () => reset2 | |
| ); | |
| }); | |
| } catch (error2) { | |
| invoke_error_boundary( | |
| error2, | |
| /** @type {Effect} */ | |
| this.#effect.parent | |
| ); | |
| return null; | |
| } | |
| }); | |
| } | |
| }; | |
| queue_micro_task(() => { | |
| var result; | |
| try { | |
| result = this.transform_error(error); | |
| } catch (e) { | |
| invoke_error_boundary(e, this.#effect && this.#effect.parent); | |
| return; | |
| } | |
| if (result !== null && typeof result === "object" && typeof /** @type {any} */ | |
| result.then === "function") { | |
| result.then( | |
| handle_error_result, | |
| /** @param {unknown} e */ | |
| (e) => invoke_error_boundary(e, this.#effect && this.#effect.parent) | |
| ); | |
| } else { | |
| handle_error_result(result); | |
| } | |
| }); | |
| } | |
| } | |
| function flatten(blockers, sync, async, fn) { | |
| const d = derived; | |
| var pending = blockers.filter((b) => !b.settled); | |
| if (async.length === 0 && pending.length === 0) { | |
| fn(sync.map(d)); | |
| return; | |
| } | |
| var parent = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var restore = capture(); | |
| var blocker_promise = pending.length === 1 ? pending[0].promise : pending.length > 1 ? Promise.all(pending.map((b) => b.promise)) : null; | |
| function finish(values) { | |
| if ((parent.f & DESTROYED) !== 0) { | |
| return; | |
| } | |
| restore(); | |
| try { | |
| fn(values); | |
| } catch (error) { | |
| invoke_error_boundary(error, parent); | |
| } | |
| unset_context(); | |
| } | |
| var decrement_pending = increment_pending(); | |
| if (async.length === 0) { | |
| blocker_promise.then(() => finish(sync.map(d))).finally(decrement_pending); | |
| return; | |
| } | |
| function run() { | |
| Promise.all(async.map((expression) => /* @__PURE__ */ async_derived(expression))).then((result) => finish([...sync.map(d), ...result])).catch((error) => invoke_error_boundary(error, parent)).finally(decrement_pending); | |
| } | |
| if (blocker_promise) { | |
| blocker_promise.then(() => { | |
| restore(); | |
| run(); | |
| unset_context(); | |
| }); | |
| } else { | |
| run(); | |
| } | |
| } | |
| function capture() { | |
| var previous_effect = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var previous_reaction = active_reaction; | |
| var previous_component_context = component_context; | |
| var previous_batch2 = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| return function restore(activate_batch = true) { | |
| set_active_effect(previous_effect); | |
| set_active_reaction(previous_reaction); | |
| set_component_context(previous_component_context); | |
| if (activate_batch && (previous_effect.f & DESTROYED) === 0) { | |
| previous_batch2?.activate(); | |
| previous_batch2?.apply(); | |
| } | |
| }; | |
| } | |
| function unset_context(deactivate_batch = true) { | |
| set_active_effect(null); | |
| set_active_reaction(null); | |
| set_component_context(null); | |
| if (deactivate_batch) current_batch?.deactivate(); | |
| } | |
| function increment_pending() { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var boundary2 = ( | |
| /** @type {Boundary} */ | |
| effect2.b | |
| ); | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| var blocking = boundary2.is_rendered(); | |
| boundary2.update_pending_count(1, batch); | |
| batch.increment(blocking, effect2); | |
| return () => { | |
| boundary2.update_pending_count(-1, batch); | |
| batch.decrement(blocking, effect2); | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function derived(fn) { | |
| var flags2 = DERIVED | DIRTY; | |
| if (active_effect !== null) { | |
| active_effect.f |= EFFECT_PRESERVED; | |
| } | |
| const signal = { | |
| ctx: component_context, | |
| deps: null, | |
| effects: null, | |
| equals, | |
| f: flags2, | |
| fn, | |
| reactions: null, | |
| rv: 0, | |
| v: ( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ), | |
| wv: 0, | |
| parent: active_effect, | |
| ac: null | |
| }; | |
| return signal; | |
| } | |
| const OBSOLETE = /* @__PURE__ */ Symbol("obsolete"); | |
| // @__NO_SIDE_EFFECTS__ | |
| function async_derived(fn, label, location2) { | |
| let parent = ( | |
| /** @type {Effect | null} */ | |
| active_effect | |
| ); | |
| if (parent === null) { | |
| async_derived_orphan(); | |
| } | |
| var promise = ( | |
| /** @type {Promise<V>} */ | |
| /** @type {unknown} */ | |
| void 0 | |
| ); | |
| var signal = source( | |
| /** @type {V} */ | |
| UNINITIALIZED | |
| ); | |
| var should_suspend = !active_reaction; | |
| var deferreds = /* @__PURE__ */ new Set(); | |
| async_effect(() => { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| var d = deferred(); | |
| promise = d.promise; | |
| try { | |
| Promise.resolve(fn()).then(d.resolve, (e) => { | |
| if (e !== STALE_REACTION) d.reject(e); | |
| }).finally(unset_context); | |
| } catch (error) { | |
| d.reject(error); | |
| unset_context(); | |
| } | |
| var batch = ( | |
| /** @type {Batch} */ | |
| current_batch | |
| ); | |
| if (should_suspend) { | |
| if ((effect2.f & REACTION_RAN) !== 0) { | |
| var decrement_pending = increment_pending(); | |
| } | |
| if ( | |
| /** @type {Boundary} */ | |
| parent.b.is_rendered() | |
| ) { | |
| batch.async_deriveds.get(effect2)?.reject(OBSOLETE); | |
| } else { | |
| for (const d2 of deferreds.values()) { | |
| d2.reject(OBSOLETE); | |
| } | |
| } | |
| deferreds.add(d); | |
| batch.async_deriveds.set(effect2, d); | |
| } | |
| const handler = (value, error = void 0) => { | |
| decrement_pending?.(); | |
| deferreds.delete(d); | |
| if (error === OBSOLETE) return; | |
| batch.activate(); | |
| if (error) { | |
| signal.f |= ERROR_VALUE; | |
| internal_set(signal, error); | |
| } else { | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| signal.f ^= ERROR_VALUE; | |
| } | |
| internal_set(signal, value); | |
| } | |
| batch.deactivate(); | |
| }; | |
| d.promise.then(handler, (e) => handler(null, e || "unknown")); | |
| }); | |
| teardown(() => { | |
| for (const d of deferreds) { | |
| d.reject(OBSOLETE); | |
| } | |
| }); | |
| return new Promise((fulfil) => { | |
| function next2(p) { | |
| function go() { | |
| if (p === promise) { | |
| fulfil(signal); | |
| } else { | |
| next2(promise); | |
| } | |
| } | |
| p.then(go, go); | |
| } | |
| next2(promise); | |
| }); | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function user_derived(fn) { | |
| const d = /* @__PURE__ */ derived(fn); | |
| push_reaction_value(d); | |
| return d; | |
| } | |
| function destroy_derived_effects(derived2) { | |
| var effects = derived2.effects; | |
| if (effects !== null) { | |
| derived2.effects = null; | |
| for (var i = 0; i < effects.length; i += 1) { | |
| destroy_effect( | |
| /** @type {Effect} */ | |
| effects[i] | |
| ); | |
| } | |
| } | |
| } | |
| function execute_derived(derived2) { | |
| var value; | |
| var prev_active_effect = active_effect; | |
| var parent = derived2.parent; | |
| if (!is_destroying_effect && parent !== null && derived2.v !== UNINITIALIZED && // if it was never evaluated before, it's guaranteed to fail downstream, so we try to execute instead | |
| (parent.f & (DESTROYED | INERT)) !== 0) { | |
| derived_inert(); | |
| return derived2.v; | |
| } | |
| set_active_effect(parent); | |
| { | |
| try { | |
| derived2.f &= ~WAS_MARKED; | |
| destroy_derived_effects(derived2); | |
| value = update_reaction(derived2); | |
| } finally { | |
| set_active_effect(prev_active_effect); | |
| } | |
| } | |
| return value; | |
| } | |
| function update_derived(derived2) { | |
| var value = execute_derived(derived2); | |
| if (!derived2.equals(value)) { | |
| derived2.wv = increment_write_version(); | |
| if (!current_batch?.is_fork || derived2.deps === null) { | |
| if (current_batch !== null) { | |
| current_batch.capture(derived2, value, true); | |
| previous_batch?.capture(derived2, value, true); | |
| } else { | |
| derived2.v = value; | |
| } | |
| if (derived2.deps === null) { | |
| set_signal_status(derived2, CLEAN); | |
| return; | |
| } | |
| } | |
| } | |
| if (is_destroying_effect) { | |
| return; | |
| } | |
| if (batch_values !== null) { | |
| if (effect_tracking() || current_batch?.is_fork) { | |
| batch_values.set(derived2, value); | |
| } | |
| } else { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| function freeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown || e.ac) { | |
| e.teardown?.(); | |
| e.ac?.abort(STALE_REACTION); | |
| if (e.fn !== null) e.teardown = noop; | |
| e.ac = null; | |
| remove_reactions(e, 0); | |
| destroy_effect_children(e); | |
| } | |
| } | |
| } | |
| function unfreeze_derived_effects(derived2) { | |
| if (derived2.effects === null) return; | |
| for (const e of derived2.effects) { | |
| if (e.teardown && e.fn !== null) { | |
| update_effect(e); | |
| } | |
| } | |
| } | |
| let eager_effects = /* @__PURE__ */ new Set(); | |
| const old_values = /* @__PURE__ */ new Map(); | |
| let eager_effects_deferred = false; | |
| function source(v, stack) { | |
| var signal = { | |
| f: 0, | |
| // TODO ideally we could skip this altogether, but it causes type errors | |
| v, | |
| reactions: null, | |
| equals, | |
| rv: 0, | |
| wv: 0 | |
| }; | |
| return signal; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function state(v, stack) { | |
| const s = source(v); | |
| push_reaction_value(s); | |
| return s; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function mutable_source(initial_value, immutable = false, trackable = true) { | |
| const s = source(initial_value); | |
| if (!immutable) { | |
| s.equals = safe_equals; | |
| } | |
| return s; | |
| } | |
| function set(source2, value, should_proxy = false) { | |
| if (active_reaction !== null && // since we are untracking the function inside `$inspect.with` we need to add this check | |
| // to ensure we error if state is set inside an inspect effect | |
| (!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) && is_runes() && (active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 && (current_sources === null || !includes.call(current_sources, source2))) { | |
| state_unsafe_mutation(); | |
| } | |
| let new_value = should_proxy ? proxy(value) : value; | |
| return internal_set(source2, new_value, legacy_updates); | |
| } | |
| function internal_set(source2, value, updated_during_traversal = null) { | |
| if (!source2.equals(value)) { | |
| old_values.set(source2, is_destroying_effect ? value : source2.v); | |
| var batch = Batch.ensure(); | |
| batch.capture(source2, value); | |
| if ((source2.f & DERIVED) !== 0) { | |
| const derived2 = ( | |
| /** @type {Derived} */ | |
| source2 | |
| ); | |
| if ((source2.f & DIRTY) !== 0) { | |
| execute_derived(derived2); | |
| } | |
| if (batch_values === null) { | |
| update_derived_status(derived2); | |
| } | |
| } | |
| source2.wv = increment_write_version(); | |
| mark_reactions(source2, DIRTY, updated_during_traversal); | |
| if (active_effect !== null && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0) { | |
| if (untracked_writes === null) { | |
| set_untracked_writes([source2]); | |
| } else { | |
| untracked_writes.push(source2); | |
| } | |
| } | |
| if (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) { | |
| flush_eager_effects(); | |
| } | |
| } | |
| return value; | |
| } | |
| function flush_eager_effects() { | |
| eager_effects_deferred = false; | |
| for (const effect2 of eager_effects) { | |
| if ((effect2.f & CLEAN) !== 0) { | |
| set_signal_status(effect2, MAYBE_DIRTY); | |
| } | |
| let dirty; | |
| try { | |
| dirty = is_dirty(effect2); | |
| } catch { | |
| dirty = true; | |
| } | |
| if (dirty) { | |
| update_effect(effect2); | |
| } | |
| } | |
| eager_effects.clear(); | |
| } | |
| function increment(source2) { | |
| set(source2, source2.v + 1); | |
| } | |
| function mark_reactions(signal, status, updated_during_traversal) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| var length = reactions.length; | |
| for (var i = 0; i < length; i++) { | |
| var reaction = reactions[i]; | |
| var flags2 = reaction.f; | |
| var not_dirty = (flags2 & DIRTY) === 0; | |
| if (not_dirty) { | |
| set_signal_status(reaction, status); | |
| } | |
| if ((flags2 & EAGER_EFFECT) !== 0) { | |
| eager_effects.add( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } else if ((flags2 & DERIVED) !== 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| reaction | |
| ); | |
| batch_values?.delete(derived2); | |
| if ((flags2 & WAS_MARKED) === 0) { | |
| if (flags2 & CONNECTED && (active_effect === null || (active_effect.f & REACTION_IS_UPDATING) === 0)) { | |
| reaction.f |= WAS_MARKED; | |
| } | |
| mark_reactions(derived2, MAYBE_DIRTY, updated_during_traversal); | |
| } | |
| } else if (not_dirty) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| if ((flags2 & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) { | |
| eager_block_effects.add(effect2); | |
| } | |
| if (updated_during_traversal !== null) { | |
| updated_during_traversal.push(effect2); | |
| } else { | |
| schedule_effect(effect2); | |
| } | |
| } | |
| } | |
| } | |
| function autofocus(dom, value) { | |
| if (value) { | |
| const body = document.body; | |
| dom.autofocus = true; | |
| queue_micro_task(() => { | |
| if (document.activeElement === body) { | |
| dom.focus(); | |
| } | |
| }); | |
| } | |
| } | |
| let listening_to_form_reset = false; | |
| function add_form_reset_listener() { | |
| if (!listening_to_form_reset) { | |
| listening_to_form_reset = true; | |
| document.addEventListener( | |
| "reset", | |
| (evt) => { | |
| Promise.resolve().then(() => { | |
| if (!evt.defaultPrevented) { | |
| for ( | |
| const e of | |
| /**@type {HTMLFormElement} */ | |
| evt.target.elements | |
| ) { | |
| e[FORM_RESET_HANDLER]?.(); | |
| } | |
| } | |
| }); | |
| }, | |
| // In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation) | |
| { capture: true } | |
| ); | |
| } | |
| } | |
| function without_reactive_context(fn) { | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| return fn(); | |
| } finally { | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| function listen_to_event_and_reset_event(element, event2, handler, on_reset = handler) { | |
| element.addEventListener(event2, () => without_reactive_context(handler)); | |
| const prev = ( | |
| /** @type {any} */ | |
| element[FORM_RESET_HANDLER] | |
| ); | |
| if (prev) { | |
| element[FORM_RESET_HANDLER] = () => { | |
| prev(); | |
| on_reset(true); | |
| }; | |
| } else { | |
| element[FORM_RESET_HANDLER] = () => on_reset(true); | |
| } | |
| add_form_reset_listener(); | |
| } | |
| let is_updating_effect = false; | |
| let is_destroying_effect = false; | |
| function set_is_destroying_effect(value) { | |
| is_destroying_effect = value; | |
| } | |
| let active_reaction = null; | |
| let untracking = false; | |
| function set_active_reaction(reaction) { | |
| active_reaction = reaction; | |
| } | |
| let active_effect = null; | |
| function set_active_effect(effect2) { | |
| active_effect = effect2; | |
| } | |
| let current_sources = null; | |
| function push_reaction_value(value) { | |
| if (active_reaction !== null && true) { | |
| if (current_sources === null) { | |
| current_sources = [value]; | |
| } else { | |
| current_sources.push(value); | |
| } | |
| } | |
| } | |
| let new_deps = null; | |
| let skipped_deps = 0; | |
| let untracked_writes = null; | |
| function set_untracked_writes(value) { | |
| untracked_writes = value; | |
| } | |
| let write_version = 1; | |
| let read_version = 0; | |
| let update_version = read_version; | |
| function set_update_version(value) { | |
| update_version = value; | |
| } | |
| function increment_write_version() { | |
| return ++write_version; | |
| } | |
| function is_dirty(reaction) { | |
| var flags2 = reaction.f; | |
| if ((flags2 & DIRTY) !== 0) { | |
| return true; | |
| } | |
| if (flags2 & DERIVED) { | |
| reaction.f &= ~WAS_MARKED; | |
| } | |
| if ((flags2 & MAYBE_DIRTY) !== 0) { | |
| var dependencies = ( | |
| /** @type {Value[]} */ | |
| reaction.deps | |
| ); | |
| var length = dependencies.length; | |
| for (var i = 0; i < length; i++) { | |
| var dependency = dependencies[i]; | |
| if (is_dirty( | |
| /** @type {Derived} */ | |
| dependency | |
| )) { | |
| update_derived( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| } | |
| if (dependency.wv > reaction.wv) { | |
| return true; | |
| } | |
| } | |
| if ((flags2 & CONNECTED) !== 0 && // During time traveling we don't want to reset the status so that | |
| // traversal of the graph in the other batches still happens | |
| batch_values === null) { | |
| set_signal_status(reaction, CLEAN); | |
| } | |
| } | |
| return false; | |
| } | |
| function schedule_possible_effect_self_invalidation(signal, effect2, root2 = true) { | |
| var reactions = signal.reactions; | |
| if (reactions === null) return; | |
| if (current_sources !== null && includes.call(current_sources, signal)) { | |
| return; | |
| } | |
| for (var i = 0; i < reactions.length; i++) { | |
| var reaction = reactions[i]; | |
| if ((reaction.f & DERIVED) !== 0) { | |
| schedule_possible_effect_self_invalidation( | |
| /** @type {Derived} */ | |
| reaction, | |
| effect2, | |
| false | |
| ); | |
| } else if (effect2 === reaction) { | |
| if (root2) { | |
| set_signal_status(reaction, DIRTY); | |
| } else if ((reaction.f & CLEAN) !== 0) { | |
| set_signal_status(reaction, MAYBE_DIRTY); | |
| } | |
| schedule_effect( | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| } | |
| function update_reaction(reaction) { | |
| var previous_deps = new_deps; | |
| var previous_skipped_deps = skipped_deps; | |
| var previous_untracked_writes = untracked_writes; | |
| var previous_reaction = active_reaction; | |
| var previous_sources = current_sources; | |
| var previous_component_context = component_context; | |
| var previous_untracking = untracking; | |
| var previous_update_version = update_version; | |
| var flags2 = reaction.f; | |
| new_deps = /** @type {null | Value[]} */ | |
| null; | |
| skipped_deps = 0; | |
| untracked_writes = null; | |
| active_reaction = (flags2 & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null; | |
| current_sources = null; | |
| set_component_context(reaction.ctx); | |
| untracking = false; | |
| update_version = ++read_version; | |
| if (reaction.ac !== null) { | |
| without_reactive_context(() => { | |
| reaction.ac.abort(STALE_REACTION); | |
| }); | |
| reaction.ac = null; | |
| } | |
| try { | |
| reaction.f |= REACTION_IS_UPDATING; | |
| var fn = ( | |
| /** @type {Function} */ | |
| reaction.fn | |
| ); | |
| var result = fn(); | |
| reaction.f |= REACTION_RAN; | |
| var deps = reaction.deps; | |
| var is_fork = current_batch?.is_fork; | |
| if (new_deps !== null) { | |
| var i; | |
| if (!is_fork) { | |
| remove_reactions(reaction, skipped_deps); | |
| } | |
| if (deps !== null && skipped_deps > 0) { | |
| deps.length = skipped_deps + new_deps.length; | |
| for (i = 0; i < new_deps.length; i++) { | |
| deps[skipped_deps + i] = new_deps[i]; | |
| } | |
| } else { | |
| reaction.deps = deps = new_deps; | |
| } | |
| if (effect_tracking() && (reaction.f & CONNECTED) !== 0) { | |
| for (i = skipped_deps; i < deps.length; i++) { | |
| (deps[i].reactions ??= []).push(reaction); | |
| } | |
| } | |
| } else if (!is_fork && deps !== null && skipped_deps < deps.length) { | |
| remove_reactions(reaction, skipped_deps); | |
| deps.length = skipped_deps; | |
| } | |
| if (is_runes() && untracked_writes !== null && !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0) { | |
| for (i = 0; i < /** @type {Source[]} */ | |
| untracked_writes.length; i++) { | |
| schedule_possible_effect_self_invalidation( | |
| untracked_writes[i], | |
| /** @type {Effect} */ | |
| reaction | |
| ); | |
| } | |
| } | |
| if (previous_reaction !== null && previous_reaction !== reaction) { | |
| read_version++; | |
| if (previous_reaction.deps !== null) { | |
| for (let i2 = 0; i2 < previous_skipped_deps; i2 += 1) { | |
| previous_reaction.deps[i2].rv = read_version; | |
| } | |
| } | |
| if (previous_deps !== null) { | |
| for (const dep of previous_deps) { | |
| dep.rv = read_version; | |
| } | |
| } | |
| if (untracked_writes !== null) { | |
| if (previous_untracked_writes === null) { | |
| previous_untracked_writes = untracked_writes; | |
| } else { | |
| previous_untracked_writes.push(.../** @type {Source[]} */ | |
| untracked_writes); | |
| } | |
| } | |
| } | |
| if ((reaction.f & ERROR_VALUE) !== 0) { | |
| reaction.f ^= ERROR_VALUE; | |
| } | |
| return result; | |
| } catch (error) { | |
| return handle_error(error); | |
| } finally { | |
| reaction.f ^= REACTION_IS_UPDATING; | |
| new_deps = previous_deps; | |
| skipped_deps = previous_skipped_deps; | |
| untracked_writes = previous_untracked_writes; | |
| active_reaction = previous_reaction; | |
| current_sources = previous_sources; | |
| set_component_context(previous_component_context); | |
| untracking = previous_untracking; | |
| update_version = previous_update_version; | |
| } | |
| } | |
| function remove_reaction(signal, dependency) { | |
| let reactions = dependency.reactions; | |
| if (reactions !== null) { | |
| var index = index_of.call(reactions, signal); | |
| if (index !== -1) { | |
| var new_length = reactions.length - 1; | |
| if (new_length === 0) { | |
| reactions = dependency.reactions = null; | |
| } else { | |
| reactions[index] = reactions[new_length]; | |
| reactions.pop(); | |
| } | |
| } | |
| } | |
| if (reactions === null && (dependency.f & DERIVED) !== 0 && // Destroying a child effect while updating a parent effect can cause a dependency to appear | |
| // to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps` | |
| // allows us to skip the expensive work of disconnecting and immediately reconnecting it | |
| (new_deps === null || !includes.call(new_deps, dependency))) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| dependency | |
| ); | |
| if ((derived2.f & CONNECTED) !== 0) { | |
| derived2.f ^= CONNECTED; | |
| derived2.f &= ~WAS_MARKED; | |
| } | |
| if (derived2.v !== UNINITIALIZED) { | |
| update_derived_status(derived2); | |
| } | |
| freeze_derived_effects(derived2); | |
| remove_reactions(derived2, 0); | |
| } | |
| } | |
| function remove_reactions(signal, start_index) { | |
| var dependencies = signal.deps; | |
| if (dependencies === null) return; | |
| for (var i = start_index; i < dependencies.length; i++) { | |
| remove_reaction(signal, dependencies[i]); | |
| } | |
| } | |
| function update_effect(effect2) { | |
| var flags2 = effect2.f; | |
| if ((flags2 & DESTROYED) !== 0) { | |
| return; | |
| } | |
| set_signal_status(effect2, CLEAN); | |
| var previous_effect = active_effect; | |
| var was_updating_effect = is_updating_effect; | |
| active_effect = effect2; | |
| is_updating_effect = true; | |
| try { | |
| if ((flags2 & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) { | |
| destroy_block_effect_children(effect2); | |
| } else { | |
| destroy_effect_children(effect2); | |
| } | |
| execute_effect_teardown(effect2); | |
| var teardown2 = update_reaction(effect2); | |
| effect2.teardown = typeof teardown2 === "function" ? teardown2 : null; | |
| effect2.wv = write_version; | |
| var dep; | |
| if (DEV && tracing_mode_flag && (effect2.f & DIRTY) !== 0 && effect2.deps !== null) ; | |
| } finally { | |
| is_updating_effect = was_updating_effect; | |
| active_effect = previous_effect; | |
| } | |
| } | |
| async function tick() { | |
| await Promise.resolve(); | |
| flushSync(); | |
| } | |
| function get(signal) { | |
| var flags2 = signal.f; | |
| var is_derived = (flags2 & DERIVED) !== 0; | |
| if (active_reaction !== null && !untracking) { | |
| var destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0; | |
| if (!destroyed && (current_sources === null || !includes.call(current_sources, signal))) { | |
| var deps = active_reaction.deps; | |
| if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { | |
| if (signal.rv < read_version) { | |
| signal.rv = read_version; | |
| if (new_deps === null && deps !== null && deps[skipped_deps] === signal) { | |
| skipped_deps++; | |
| } else if (new_deps === null) { | |
| new_deps = [signal]; | |
| } else { | |
| new_deps.push(signal); | |
| } | |
| } | |
| } else { | |
| (active_reaction.deps ??= []).push(signal); | |
| var reactions = signal.reactions; | |
| if (reactions === null) { | |
| signal.reactions = [active_reaction]; | |
| } else if (!includes.call(reactions, active_reaction)) { | |
| reactions.push(active_reaction); | |
| } | |
| } | |
| } | |
| } | |
| if (is_destroying_effect && old_values.has(signal)) { | |
| return old_values.get(signal); | |
| } | |
| if (is_derived) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| signal | |
| ); | |
| if (is_destroying_effect) { | |
| var value = derived2.v; | |
| if ((derived2.f & CLEAN) === 0 && derived2.reactions !== null || depends_on_old_values(derived2)) { | |
| value = execute_derived(derived2); | |
| } | |
| old_values.set(derived2, value); | |
| return value; | |
| } | |
| var should_connect = (derived2.f & CONNECTED) === 0 && !untracking && active_reaction !== null && (is_updating_effect || (active_reaction.f & CONNECTED) !== 0); | |
| var is_new = (derived2.f & REACTION_RAN) === 0; | |
| if (is_dirty(derived2)) { | |
| if (should_connect) { | |
| derived2.f |= CONNECTED; | |
| } | |
| update_derived(derived2); | |
| } | |
| if (should_connect && !is_new) { | |
| unfreeze_derived_effects(derived2); | |
| reconnect(derived2); | |
| } | |
| } | |
| if (batch_values?.has(signal)) { | |
| return batch_values.get(signal); | |
| } | |
| if ((signal.f & ERROR_VALUE) !== 0) { | |
| throw signal.v; | |
| } | |
| return signal.v; | |
| } | |
| function reconnect(derived2) { | |
| derived2.f |= CONNECTED; | |
| if (derived2.deps === null) return; | |
| for (const dep of derived2.deps) { | |
| (dep.reactions ??= []).push(derived2); | |
| if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) { | |
| unfreeze_derived_effects( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| reconnect( | |
| /** @type {Derived} */ | |
| dep | |
| ); | |
| } | |
| } | |
| } | |
| function depends_on_old_values(derived2) { | |
| if (derived2.v === UNINITIALIZED) return true; | |
| if (derived2.deps === null) return false; | |
| for (const dep of derived2.deps) { | |
| if (old_values.has(dep)) { | |
| return true; | |
| } | |
| if ((dep.f & DERIVED) !== 0 && depends_on_old_values( | |
| /** @type {Derived} */ | |
| dep | |
| )) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function validate_effect(rune) { | |
| if (active_effect === null) { | |
| if (active_reaction === null) { | |
| effect_orphan(); | |
| } | |
| effect_in_unowned_derived(); | |
| } | |
| if (is_destroying_effect) { | |
| effect_in_teardown(); | |
| } | |
| } | |
| function push_effect(effect2, parent_effect) { | |
| var parent_last = parent_effect.last; | |
| if (parent_last === null) { | |
| parent_effect.last = parent_effect.first = effect2; | |
| } else { | |
| parent_last.next = effect2; | |
| effect2.prev = parent_last; | |
| parent_effect.last = effect2; | |
| } | |
| } | |
| function create_effect(type, fn) { | |
| var parent = active_effect; | |
| if (parent !== null && (parent.f & INERT) !== 0) { | |
| type |= INERT; | |
| } | |
| var effect2 = { | |
| ctx: component_context, | |
| deps: null, | |
| nodes: null, | |
| f: type | DIRTY | CONNECTED, | |
| first: null, | |
| fn, | |
| last: null, | |
| next: null, | |
| parent, | |
| b: parent && parent.b, | |
| prev: null, | |
| teardown: null, | |
| wv: 0, | |
| ac: null | |
| }; | |
| current_batch?.register_created_effect(effect2); | |
| var e = effect2; | |
| if ((type & EFFECT) !== 0) { | |
| if (collected_effects !== null) { | |
| collected_effects.push(effect2); | |
| } else { | |
| Batch.ensure().schedule(effect2); | |
| } | |
| } else if (fn !== null) { | |
| try { | |
| update_effect(effect2); | |
| } catch (e2) { | |
| destroy_effect(effect2); | |
| throw e2; | |
| } | |
| if (e.deps === null && e.teardown === null && e.nodes === null && e.first === e.last && // either `null`, or a singular child | |
| (e.f & EFFECT_PRESERVED) === 0) { | |
| e = e.first; | |
| if ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) { | |
| e.f |= EFFECT_TRANSPARENT; | |
| } | |
| } | |
| } | |
| if (e !== null) { | |
| e.parent = parent; | |
| if (parent !== null) { | |
| push_effect(e, parent); | |
| } | |
| if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0 && (type & ROOT_EFFECT) === 0) { | |
| var derived2 = ( | |
| /** @type {Derived} */ | |
| active_reaction | |
| ); | |
| (derived2.effects ??= []).push(e); | |
| } | |
| } | |
| return effect2; | |
| } | |
| function effect_tracking() { | |
| return active_reaction !== null && !untracking; | |
| } | |
| function teardown(fn) { | |
| const effect2 = create_effect(RENDER_EFFECT, null); | |
| set_signal_status(effect2, CLEAN); | |
| effect2.teardown = fn; | |
| return effect2; | |
| } | |
| function user_effect(fn) { | |
| validate_effect(); | |
| var flags2 = ( | |
| /** @type {Effect} */ | |
| active_effect.f | |
| ); | |
| var defer = !active_reaction && (flags2 & BRANCH_EFFECT) !== 0 && (flags2 & REACTION_RAN) === 0; | |
| if (defer) { | |
| var context = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| (context.e ??= []).push(fn); | |
| } else { | |
| return create_user_effect(fn); | |
| } | |
| } | |
| function create_user_effect(fn) { | |
| return create_effect(EFFECT | USER_EFFECT, fn); | |
| } | |
| function effect_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return () => { | |
| destroy_effect(effect2); | |
| }; | |
| } | |
| function component_root(fn) { | |
| Batch.ensure(); | |
| const effect2 = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn); | |
| return (options = {}) => { | |
| return new Promise((fulfil) => { | |
| if (options.outro) { | |
| pause_effect(effect2, () => { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| }); | |
| } else { | |
| destroy_effect(effect2); | |
| fulfil(void 0); | |
| } | |
| }); | |
| }; | |
| } | |
| function effect(fn) { | |
| return create_effect(EFFECT, fn); | |
| } | |
| function async_effect(fn) { | |
| return create_effect(ASYNC | EFFECT_PRESERVED, fn); | |
| } | |
| function render_effect(fn, flags2 = 0) { | |
| return create_effect(RENDER_EFFECT | flags2, fn); | |
| } | |
| function template_effect(fn, sync = [], async = [], blockers = []) { | |
| flatten(blockers, sync, async, (values) => { | |
| create_effect(RENDER_EFFECT, () => fn(...values.map(get))); | |
| }); | |
| } | |
| function block(fn, flags2 = 0) { | |
| var effect2 = create_effect(BLOCK_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function managed(fn, flags2 = 0) { | |
| var effect2 = create_effect(MANAGED_EFFECT | flags2, fn); | |
| return effect2; | |
| } | |
| function branch(fn) { | |
| return create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn); | |
| } | |
| function execute_effect_teardown(effect2) { | |
| var teardown2 = effect2.teardown; | |
| if (teardown2 !== null) { | |
| const previously_destroying_effect = is_destroying_effect; | |
| const previous_reaction = active_reaction; | |
| set_is_destroying_effect(true); | |
| set_active_reaction(null); | |
| try { | |
| teardown2.call(null); | |
| } finally { | |
| set_is_destroying_effect(previously_destroying_effect); | |
| set_active_reaction(previous_reaction); | |
| } | |
| } | |
| } | |
| function destroy_effect_children(signal, remove_dom = false) { | |
| var effect2 = signal.first; | |
| signal.first = signal.last = null; | |
| while (effect2 !== null) { | |
| const controller = effect2.ac; | |
| if (controller !== null) { | |
| without_reactive_context(() => { | |
| controller.abort(STALE_REACTION); | |
| }); | |
| } | |
| var next2 = effect2.next; | |
| if ((effect2.f & ROOT_EFFECT) !== 0) { | |
| effect2.parent = null; | |
| } else { | |
| destroy_effect(effect2, remove_dom); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_block_effect_children(signal) { | |
| var effect2 = signal.first; | |
| while (effect2 !== null) { | |
| var next2 = effect2.next; | |
| if ((effect2.f & BRANCH_EFFECT) === 0) { | |
| destroy_effect(effect2); | |
| } | |
| effect2 = next2; | |
| } | |
| } | |
| function destroy_effect(effect2, remove_dom = true) { | |
| var removed = false; | |
| if ((remove_dom || (effect2.f & HEAD_EFFECT) !== 0) && effect2.nodes !== null && effect2.nodes.end !== null) { | |
| remove_effect_dom( | |
| effect2.nodes.start, | |
| /** @type {TemplateNode} */ | |
| effect2.nodes.end | |
| ); | |
| removed = true; | |
| } | |
| set_signal_status(effect2, DESTROYING); | |
| destroy_effect_children(effect2, remove_dom && !removed); | |
| remove_reactions(effect2, 0); | |
| var transitions = effect2.nodes && effect2.nodes.t; | |
| if (transitions !== null) { | |
| for (const transition of transitions) { | |
| transition.stop(); | |
| } | |
| } | |
| execute_effect_teardown(effect2); | |
| effect2.f ^= DESTROYING; | |
| effect2.f |= DESTROYED; | |
| var parent = effect2.parent; | |
| if (parent !== null && parent.first !== null) { | |
| unlink_effect(effect2); | |
| } | |
| effect2.next = effect2.prev = effect2.teardown = effect2.ctx = effect2.deps = effect2.fn = effect2.nodes = effect2.ac = effect2.b = null; | |
| } | |
| function remove_effect_dom(node, end) { | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| node.remove(); | |
| node = next2; | |
| } | |
| } | |
| function unlink_effect(effect2) { | |
| var parent = effect2.parent; | |
| var prev = effect2.prev; | |
| var next2 = effect2.next; | |
| if (prev !== null) prev.next = next2; | |
| if (next2 !== null) next2.prev = prev; | |
| if (parent !== null) { | |
| if (parent.first === effect2) parent.first = next2; | |
| if (parent.last === effect2) parent.last = prev; | |
| } | |
| } | |
| function pause_effect(effect2, callback, destroy = true) { | |
| var transitions = []; | |
| pause_children(effect2, transitions, true); | |
| var fn = () => { | |
| if (destroy) destroy_effect(effect2); | |
| if (callback) callback(); | |
| }; | |
| var remaining = transitions.length; | |
| if (remaining > 0) { | |
| var check = () => --remaining || fn(); | |
| for (var transition of transitions) { | |
| transition.out(check); | |
| } | |
| } else { | |
| fn(); | |
| } | |
| } | |
| function pause_children(effect2, transitions, local) { | |
| if ((effect2.f & INERT) !== 0) return; | |
| effect2.f ^= INERT; | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transitions.push(transition); | |
| } | |
| } | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| if ((child2.f & ROOT_EFFECT) === 0) { | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || // If this is a branch effect without a block effect parent, | |
| // it means the parent block effect was pruned. In that case, | |
| // transparency information was transferred to the branch effect. | |
| (child2.f & BRANCH_EFFECT) !== 0 && (effect2.f & BLOCK_EFFECT) !== 0; | |
| pause_children(child2, transitions, transparent ? local : false); | |
| } | |
| child2 = sibling2; | |
| } | |
| } | |
| function resume_effect(effect2) { | |
| resume_children(effect2, true); | |
| } | |
| function resume_children(effect2, local) { | |
| if ((effect2.f & INERT) === 0) return; | |
| effect2.f ^= INERT; | |
| if ((effect2.f & CLEAN) === 0) { | |
| set_signal_status(effect2, DIRTY); | |
| Batch.ensure().schedule(effect2); | |
| } | |
| var child2 = effect2.first; | |
| while (child2 !== null) { | |
| var sibling2 = child2.next; | |
| var transparent = (child2.f & EFFECT_TRANSPARENT) !== 0 || (child2.f & BRANCH_EFFECT) !== 0; | |
| resume_children(child2, transparent ? local : false); | |
| child2 = sibling2; | |
| } | |
| var t = effect2.nodes && effect2.nodes.t; | |
| if (t !== null) { | |
| for (const transition of t) { | |
| if (transition.is_global || local) { | |
| transition.in(); | |
| } | |
| } | |
| } | |
| } | |
| function move_effect(effect2, fragment) { | |
| if (!effect2.nodes) return; | |
| var node = effect2.nodes.start; | |
| var end = effect2.nodes.end; | |
| while (node !== null) { | |
| var next2 = node === end ? null : /* @__PURE__ */ get_next_sibling(node); | |
| fragment.append(node); | |
| node = next2; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get$1(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get$1(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get$1(scope.store), name); | |
| } | |
| scope.store.set(get$1(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (official website)", | |
| cancel: "Cancel", | |
| enterCode: "Enter code", | |
| enterCodeAria: "Enter code you hear. Press Space to play audio.", | |
| enterCodeFromImage: "To proceed, please enter the code from the image below.", | |
| error: "Verification failed. Try again later.", | |
| expired: "Verification expired. Try again.", | |
| footer: 'Protected by <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (official website)">ALTCHA</a>', | |
| getAudioChallenge: "Get an audio challenge", | |
| label: "I'm not a robot", | |
| loading: "Loading...", | |
| reload: "Reload", | |
| verify: "Verify", | |
| verificationRequired: "Verification required!", | |
| verified: "Verified", | |
| verifying: "Verifying...", | |
| waitAlert: "Verifying... please wait." | |
| }; | |
| globalThis.$altcha.i18n.set("en", i18n); | |
| const PUBLIC_VERSION = "5"; | |
| if (typeof window !== "undefined") { | |
| ((window.__svelte ??= {}).v ??= /* @__PURE__ */ new Set()).add(PUBLIC_VERSION); | |
| } | |
| const event_symbol = /* @__PURE__ */ Symbol("events"); | |
| const all_registered_events = /* @__PURE__ */ new Set(); | |
| const root_event_handles = /* @__PURE__ */ new Set(); | |
| function create_event(event_name, dom, handler, options = {}) { | |
| function target_handler(event2) { | |
| if (!options.capture) { | |
| handle_event_propagation.call(dom, event2); | |
| } | |
| if (!event2.cancelBubble) { | |
| return without_reactive_context(() => { | |
| return handler?.call(this, event2); | |
| }); | |
| } | |
| } | |
| if (event_name.startsWith("pointer") || event_name.startsWith("touch") || event_name === "wheel") { | |
| queue_micro_task(() => { | |
| dom.addEventListener(event_name, target_handler, options); | |
| }); | |
| } else { | |
| dom.addEventListener(event_name, target_handler, options); | |
| } | |
| return target_handler; | |
| } | |
| function event(event_name, dom, handler, capture2, passive) { | |
| var options = { capture: capture2, passive }; | |
| var target_handler = create_event(event_name, dom, handler, options); | |
| if (dom === document.body || // @ts-ignore | |
| dom === window || // @ts-ignore | |
| dom === document || // Firefox has quirky behavior, it can happen that we still get "canplay" events when the element is already removed | |
| dom instanceof HTMLMediaElement) { | |
| teardown(() => { | |
| dom.removeEventListener(event_name, target_handler, options); | |
| }); | |
| } | |
| } | |
| function delegated(event_name, element, handler) { | |
| (element[event_symbol] ??= {})[event_name] = handler; | |
| } | |
| function delegate(events) { | |
| for (var i = 0; i < events.length; i++) { | |
| all_registered_events.add(events[i]); | |
| } | |
| for (var fn of root_event_handles) { | |
| fn(events); | |
| } | |
| } | |
| let last_propagated_event = null; | |
| function handle_event_propagation(event2) { | |
| var handler_element = this; | |
| var owner_document = ( | |
| /** @type {Node} */ | |
| handler_element.ownerDocument | |
| ); | |
| var event_name = event2.type; | |
| var path = event2.composedPath?.() || []; | |
| var current_target = ( | |
| /** @type {null | Element} */ | |
| path[0] || event2.target | |
| ); | |
| last_propagated_event = event2; | |
| var path_idx = 0; | |
| var handled_at = last_propagated_event === event2 && event2[event_symbol]; | |
| if (handled_at) { | |
| var at_idx = path.indexOf(handled_at); | |
| if (at_idx !== -1 && (handler_element === document || handler_element === /** @type {any} */ | |
| window)) { | |
| event2[event_symbol] = handler_element; | |
| return; | |
| } | |
| var handler_idx = path.indexOf(handler_element); | |
| if (handler_idx === -1) { | |
| return; | |
| } | |
| if (at_idx <= handler_idx) { | |
| path_idx = at_idx; | |
| } | |
| } | |
| current_target = /** @type {Element} */ | |
| path[path_idx] || event2.target; | |
| if (current_target === handler_element) return; | |
| define_property(event2, "currentTarget", { | |
| configurable: true, | |
| get() { | |
| return current_target || owner_document; | |
| } | |
| }); | |
| var previous_reaction = active_reaction; | |
| var previous_effect = active_effect; | |
| set_active_reaction(null); | |
| set_active_effect(null); | |
| try { | |
| var throw_error; | |
| var other_errors = []; | |
| while (current_target !== null) { | |
| var parent_element = current_target.assignedSlot || current_target.parentNode || /** @type {any} */ | |
| current_target.host || null; | |
| try { | |
| var delegated2 = current_target[event_symbol]?.[event_name]; | |
| if (delegated2 != null && (!/** @type {any} */ | |
| current_target.disabled || // DOM could've been updated already by the time this is reached, so we check this as well | |
| // -> the target could not have been disabled because it emits the event in the first place | |
| event2.target === current_target)) { | |
| delegated2.call(current_target, event2); | |
| } | |
| } catch (error) { | |
| if (throw_error) { | |
| other_errors.push(error); | |
| } else { | |
| throw_error = error; | |
| } | |
| } | |
| if (event2.cancelBubble || parent_element === handler_element || parent_element === null) { | |
| break; | |
| } | |
| current_target = parent_element; | |
| } | |
| if (throw_error) { | |
| for (let error of other_errors) { | |
| queueMicrotask(() => { | |
| throw error; | |
| }); | |
| } | |
| throw throw_error; | |
| } | |
| } finally { | |
| event2[event_symbol] = handler_element; | |
| delete event2.currentTarget; | |
| set_active_reaction(previous_reaction); | |
| set_active_effect(previous_effect); | |
| } | |
| } | |
| const policy = ( | |
| // We gotta write it like this because after downleveling the pure comment may end up in the wrong location | |
| globalThis?.window?.trustedTypes && /* @__PURE__ */ globalThis.window.trustedTypes.createPolicy("svelte-trusted-html", { | |
| /** @param {string} html */ | |
| createHTML: (html2) => { | |
| return html2; | |
| } | |
| }) | |
| ); | |
| function create_trusted_html(html2) { | |
| return ( | |
| /** @type {string} */ | |
| policy?.createHTML(html2) ?? html2 | |
| ); | |
| } | |
| function create_fragment_from_html(html2) { | |
| var elem = create_element("template"); | |
| elem.innerHTML = create_trusted_html(html2.replaceAll("<!>", "<!---->")); | |
| return elem.content; | |
| } | |
| function assign_nodes(start, end) { | |
| var effect2 = ( | |
| /** @type {Effect} */ | |
| active_effect | |
| ); | |
| if (effect2.nodes === null) { | |
| effect2.nodes = { start, end, a: null, t: null }; | |
| } | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_html(content, flags2) { | |
| var is_fragment = (flags2 & TEMPLATE_FRAGMENT) !== 0; | |
| var use_import_node = (flags2 & TEMPLATE_USE_IMPORT_NODE) !== 0; | |
| var node; | |
| var has_start = !content.startsWith("<!>"); | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (node === void 0) { | |
| node = create_fragment_from_html(has_start ? content : "<!>" + content); | |
| if (!is_fragment) node = /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(node); | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| use_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true) | |
| ); | |
| if (is_fragment) { | |
| var start = ( | |
| /** @type {TemplateNode} */ | |
| /* @__PURE__ */ get_first_child(clone) | |
| ); | |
| var end = ( | |
| /** @type {TemplateNode} */ | |
| clone.lastChild | |
| ); | |
| assign_nodes(start, end); | |
| } else { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_namespace(content, flags2, ns = "svg") { | |
| var has_start = !content.startsWith("<!>"); | |
| var wrapped = `<${ns}>${has_start ? content : "<!>" + content}</${ns}>`; | |
| var node; | |
| return () => { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| if (!node) { | |
| var fragment = ( | |
| /** @type {DocumentFragment} */ | |
| create_fragment_from_html(wrapped) | |
| ); | |
| var root2 = ( | |
| /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(fragment) | |
| ); | |
| { | |
| node = /** @type {Element} */ | |
| /* @__PURE__ */ get_first_child(root2); | |
| } | |
| } | |
| var clone = ( | |
| /** @type {TemplateNode} */ | |
| node.cloneNode(true) | |
| ); | |
| { | |
| assign_nodes(clone, clone); | |
| } | |
| return clone; | |
| }; | |
| } | |
| // @__NO_SIDE_EFFECTS__ | |
| function from_svg(content, flags2) { | |
| return /* @__PURE__ */ from_namespace(content, flags2, "svg"); | |
| } | |
| function text(value = "") { | |
| if (!hydrating) { | |
| var t = create_text(value + ""); | |
| assign_nodes(t, t); | |
| return t; | |
| } | |
| var node = hydrate_node; | |
| if (node.nodeType !== TEXT_NODE) { | |
| node.before(node = create_text()); | |
| set_hydrate_node(node); | |
| } else { | |
| merge_text_nodes( | |
| /** @type {Text} */ | |
| node | |
| ); | |
| } | |
| assign_nodes(node, node); | |
| return node; | |
| } | |
| function comment() { | |
| if (hydrating) { | |
| assign_nodes(hydrate_node, null); | |
| return hydrate_node; | |
| } | |
| var frag = document.createDocumentFragment(); | |
| var start = document.createComment(""); | |
| var anchor = create_text(); | |
| frag.append(start, anchor); | |
| assign_nodes(start, anchor); | |
| return frag; | |
| } | |
| function append(anchor, dom) { | |
| if (hydrating) { | |
| var effect2 = ( | |
| /** @type {Effect & { nodes: EffectNodes }} */ | |
| active_effect | |
| ); | |
| if ((effect2.f & REACTION_RAN) === 0 || effect2.nodes.end === null) { | |
| effect2.nodes.end = hydrate_node; | |
| } | |
| hydrate_next(); | |
| return; | |
| } | |
| if (anchor === null) { | |
| return; | |
| } | |
| anchor.before( | |
| /** @type {Node} */ | |
| dom | |
| ); | |
| } | |
| function is_capture_event(name) { | |
| return name.endsWith("capture") && name !== "gotpointercapture" && name !== "lostpointercapture"; | |
| } | |
| const DELEGATED_EVENTS = [ | |
| "beforeinput", | |
| "click", | |
| "change", | |
| "dblclick", | |
| "contextmenu", | |
| "focusin", | |
| "focusout", | |
| "input", | |
| "keydown", | |
| "keyup", | |
| "mousedown", | |
| "mousemove", | |
| "mouseout", | |
| "mouseover", | |
| "mouseup", | |
| "pointerdown", | |
| "pointermove", | |
| "pointerout", | |
| "pointerover", | |
| "pointerup", | |
| "touchend", | |
| "touchmove", | |
| "touchstart" | |
| ]; | |
| function can_delegate_event(event_name) { | |
| return DELEGATED_EVENTS.includes(event_name); | |
| } | |
| const ATTRIBUTE_ALIASES = { | |
| // no `class: 'className'` because we handle that separately | |
| formnovalidate: "formNoValidate", | |
| ismap: "isMap", | |
| nomodule: "noModule", | |
| playsinline: "playsInline", | |
| readonly: "readOnly", | |
| defaultvalue: "defaultValue", | |
| defaultchecked: "defaultChecked", | |
| srcobject: "srcObject", | |
| novalidate: "noValidate", | |
| allowfullscreen: "allowFullscreen", | |
| disablepictureinpicture: "disablePictureInPicture", | |
| disableremoteplayback: "disableRemotePlayback" | |
| }; | |
| function normalize_attribute(name) { | |
| name = name.toLowerCase(); | |
| return ATTRIBUTE_ALIASES[name] ?? name; | |
| } | |
| const PASSIVE_EVENTS = ["touchstart", "touchmove"]; | |
| function is_passive_event(name) { | |
| return PASSIVE_EVENTS.includes(name); | |
| } | |
| function set_text(text2, value) { | |
| var str = value == null ? "" : typeof value === "object" ? `${value}` : value; | |
| if (str !== /** @type {any} */ | |
| (text2[TEXT_CACHE] ??= text2.nodeValue)) { | |
| text2[TEXT_CACHE] = str; | |
| text2.nodeValue = `${str}`; | |
| } | |
| } | |
| function mount(component2, options) { | |
| return _mount(component2, options); | |
| } | |
| function hydrate(component2, options) { | |
| init_operations(); | |
| options.intro = options.intro ?? false; | |
| const target = options.target; | |
| const was_hydrating = hydrating; | |
| const previous_hydrate_node = hydrate_node; | |
| try { | |
| var anchor = /* @__PURE__ */ get_first_child(target); | |
| while (anchor && (anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| anchor.data !== HYDRATION_START)) { | |
| anchor = /* @__PURE__ */ get_next_sibling(anchor); | |
| } | |
| if (!anchor) { | |
| throw HYDRATION_ERROR; | |
| } | |
| set_hydrating(true); | |
| set_hydrate_node( | |
| /** @type {Comment} */ | |
| anchor | |
| ); | |
| const instance = _mount(component2, { ...options, anchor }); | |
| set_hydrating(false); | |
| return ( | |
| /** @type {Exports} */ | |
| instance | |
| ); | |
| } catch (error) { | |
| if (error instanceof Error && error.message.split("\n").some((line) => line.startsWith("https://svelte.dev/e/"))) { | |
| throw error; | |
| } | |
| if (error !== HYDRATION_ERROR) { | |
| console.warn("Failed to hydrate: ", error); | |
| } | |
| if (options.recover === false) { | |
| hydration_failed(); | |
| } | |
| init_operations(); | |
| clear_text_content(target); | |
| set_hydrating(false); | |
| return mount(component2, options); | |
| } finally { | |
| set_hydrating(was_hydrating); | |
| set_hydrate_node(previous_hydrate_node); | |
| } | |
| } | |
| const listeners = /* @__PURE__ */ new Map(); | |
| function _mount(Component, { target, anchor, props = {}, events, context, intro = true, transformError }) { | |
| init_operations(); | |
| var component2 = void 0; | |
| var unmount2 = component_root(() => { | |
| var anchor_node = anchor ?? target.appendChild(create_text()); | |
| boundary( | |
| /** @type {TemplateNode} */ | |
| anchor_node, | |
| { | |
| pending: () => { | |
| } | |
| }, | |
| (anchor_node2) => { | |
| push({}); | |
| var ctx = ( | |
| /** @type {ComponentContext} */ | |
| component_context | |
| ); | |
| if (context) ctx.c = context; | |
| if (events) { | |
| props.$$events = events; | |
| } | |
| if (hydrating) { | |
| assign_nodes( | |
| /** @type {TemplateNode} */ | |
| anchor_node2, | |
| null | |
| ); | |
| } | |
| component2 = Component(anchor_node2, props) || {}; | |
| if (hydrating) { | |
| active_effect.nodes.end = hydrate_node; | |
| if (hydrate_node === null || hydrate_node.nodeType !== COMMENT_NODE || /** @type {Comment} */ | |
| hydrate_node.data !== HYDRATION_END) { | |
| hydration_mismatch(); | |
| throw HYDRATION_ERROR; | |
| } | |
| } | |
| pop(); | |
| }, | |
| transformError | |
| ); | |
| var registered_events = /* @__PURE__ */ new Set(); | |
| var event_handle = (events2) => { | |
| for (var i = 0; i < events2.length; i++) { | |
| var event_name = events2[i]; | |
| if (registered_events.has(event_name)) continue; | |
| registered_events.add(event_name); | |
| var passive = is_passive_event(event_name); | |
| for (const node of [target, document]) { | |
| var counts = listeners.get(node); | |
| if (counts === void 0) { | |
| counts = /* @__PURE__ */ new Map(); | |
| listeners.set(node, counts); | |
| } | |
| var count = counts.get(event_name); | |
| if (count === void 0) { | |
| node.addEventListener(event_name, handle_event_propagation, { passive }); | |
| counts.set(event_name, 1); | |
| } else { | |
| counts.set(event_name, count + 1); | |
| } | |
| } | |
| } | |
| }; | |
| event_handle(array_from(all_registered_events)); | |
| root_event_handles.add(event_handle); | |
| return () => { | |
| for (var event_name of registered_events) { | |
| for (const node of [target, document]) { | |
| var counts = ( | |
| /** @type {Map<string, number>} */ | |
| listeners.get(node) | |
| ); | |
| var count = ( | |
| /** @type {number} */ | |
| counts.get(event_name) | |
| ); | |
| if (--count == 0) { | |
| node.removeEventListener(event_name, handle_event_propagation); | |
| counts.delete(event_name); | |
| if (counts.size === 0) { | |
| listeners.delete(node); | |
| } | |
| } else { | |
| counts.set(event_name, count); | |
| } | |
| } | |
| } | |
| root_event_handles.delete(event_handle); | |
| if (anchor_node !== anchor) { | |
| anchor_node.parentNode?.removeChild(anchor_node); | |
| } | |
| }; | |
| }); | |
| mounted_components.set(component2, unmount2); | |
| return component2; | |
| } | |
| let mounted_components = /* @__PURE__ */ new WeakMap(); | |
| function unmount(component2, options) { | |
| const fn = mounted_components.get(component2); | |
| if (fn) { | |
| mounted_components.delete(component2); | |
| return fn(options); | |
| } | |
| return Promise.resolve(); | |
| } | |
| class BranchManager { | |
| /** @type {TemplateNode} */ | |
| anchor; | |
| /** @type {Map<Batch, Key>} */ | |
| #batches = /* @__PURE__ */ new Map(); | |
| /** | |
| * Map of keys to effects that are currently rendered in the DOM. | |
| * These effects are visible and actively part of the document tree. | |
| * Example: | |
| * |
변경 전i18n.js
변경 후i18n.js
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
| const noop = () => { | |
| }; | |
| function safe_not_equal(a, b) { | |
| return a != a ? b == b : a !== b || a !== null && typeof a === "object" || typeof a === "function"; | |
| } | |
| function subscribe_to_store(store2, run, invalidate) { | |
| if (store2 == null) { | |
| run(void 0); | |
| return noop; | |
| } | |
| const unsub = untrack( | |
| () => store2.subscribe( | |
| run, | |
| // @ts-expect-error | |
| invalidate | |
| ) | |
| ); | |
| return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; | |
| } | |
| const subscriber_queue = []; | |
| function writable(value, start = noop) { | |
| let stop = null; | |
| const subscribers = /* @__PURE__ */ new Set(); | |
| function set(new_value) { | |
| if (safe_not_equal(value, new_value)) { | |
| value = new_value; | |
| if (stop) { | |
| const run_queue = !subscriber_queue.length; | |
| for (const subscriber of subscribers) { | |
| subscriber[1](); | |
| subscriber_queue.push(subscriber, value); | |
| } | |
| if (run_queue) { | |
| for (let i = 0; i < subscriber_queue.length; i += 2) { | |
| subscriber_queue[i][0](subscriber_queue[i + 1]); | |
| } | |
| subscriber_queue.length = 0; | |
| } | |
| } | |
| } | |
| } | |
| function update(fn) { | |
| set(fn( | |
| /** @type {T} */ | |
| value | |
| )); | |
| } | |
| function subscribe(run, invalidate = noop) { | |
| const subscriber = [run, invalidate]; | |
| subscribers.add(subscriber); | |
| if (subscribers.size === 1) { | |
| stop = start(set, update) || noop; | |
| } | |
| run( | |
| /** @type {T} */ | |
| value | |
| ); | |
| return () => { | |
| subscribers.delete(subscriber); | |
| if (subscribers.size === 0 && stop) { | |
| stop(); | |
| stop = null; | |
| } | |
| }; | |
| } | |
| return { set, update, subscribe }; | |
| } | |
| function get(store2) { | |
| let value; | |
| subscribe_to_store(store2, (_) => value = _)(); | |
| return value; | |
| } | |
| let untracking = false; | |
| function untrack(fn) { | |
| var previous_untracking = untracking; | |
| try { | |
| untracking = true; | |
| return fn(); | |
| } finally { | |
| untracking = previous_untracking; | |
| } | |
| } | |
| function store(defaultValue) { | |
| const scope = { | |
| get: (name) => { | |
| return get(scope.store)[name]; | |
| }, | |
| set: (name, value) => { | |
| if (typeof name === "string") { | |
| Object.assign(get(scope.store), { | |
| [name]: value | |
| }); | |
| } else { | |
| Object.assign(get(scope.store), name); | |
| } | |
| scope.store.set(get(scope.store)); | |
| }, | |
| store: writable(defaultValue) | |
| }; | |
| return scope; | |
| } | |
| globalThis.$altcha = globalThis.$altcha || { | |
| algorithms: /* @__PURE__ */ new Map(), | |
| defaults: store({}), | |
| i18n: store({}), | |
| instances: /* @__PURE__ */ new Set(), | |
| plugins: /* @__PURE__ */ new Set() | |
| }; | |
| const i18n$Y = { | |
| ariaLinkLabel: "Altcha (الموقع الرسمي)", | |
| enterCode: "أدخل الرمز", | |
| enterCodeAria: "أدخل الرمز الذي تسمعه. اضغط على المسافة لتشغيل الصوت.", | |
| error: "فشل التحقق. حاول مرة أخرى لاحقاً.", | |
| expired: "انتهت صلاحية التحقق. حاول مرة أخرى.", | |
| footer: 'محمي بواسطة <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (الموقع الرسمي)">ALTCHA</a>', | |
| getAudioChallenge: "احصل على تحدي صوتي", | |
| label: "أنا لست روبوتاً", | |
| loading: "جارٍ التحميل...", | |
| reload: "إعادة تحميل", | |
| verify: "تحقق", | |
| verificationRequired: "مطلوب التحقق!", | |
| verified: "تم التحقق", | |
| verifying: "جارٍ التحقق...", | |
| waitAlert: "جارٍ التحقق... يرجى الانتظار.", | |
| cancel: "إلغاء", | |
| enterCodeFromImage: "للمتابعة، يرجى إدخال الرمز من الصورة أدناه." | |
| }; | |
| globalThis.$altcha.i18n.set("ar", i18n$Y); | |
| const i18n$X = { | |
| ariaLinkLabel: "Altcha (официален уебсайт)", | |
| enterCode: "Въведете код", | |
| enterCodeAria: "Въведете кода, който чувате. Натиснете Space за възпроизвеждане на аудио.", | |
| error: "Проверката неуспешна. Моля, опитайте по-късно.", | |
| expired: "Времето за проверка изтече. Моля, опитайте отново.", | |
| footer: 'Защитено от <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официален уебсайт)">ALTCHA</a>', | |
| getAudioChallenge: "Аудио проверка", | |
| label: "Аз не съм робот", | |
| loading: "Зареждане...", | |
| reload: "Презареди", | |
| verify: "Провери", | |
| verificationRequired: "Изисква се проверка!", | |
| verified: "Проверено", | |
| verifying: "Проверява се...", | |
| waitAlert: "Проверката е в процес... моля изчакайте.", | |
| cancel: "Отказ", | |
| enterCodeFromImage: "За да продължите, моля, въведете кода от изображението по-долу." | |
| }; | |
| globalThis.$altcha.i18n.set("bg", i18n$X); | |
| const i18n$W = { | |
| ariaLinkLabel: "Altcha (афіцыйны сайт)", | |
| enterCode: "Увядзіце код", | |
| enterCodeAria: "Увядзіце код, які вы чуеце. Націсніце прабел, каб прайграць аўдыё.", | |
| error: "Праверка не прайшла. Паспрабуйце пазней.", | |
| expired: "Тэрмін праверкі скончыўся. Паспрабуйце зноў.", | |
| footer: 'Абаронена <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (афіцыйны сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Атрымаць аўдыё выклік", | |
| label: "Я не робат", | |
| loading: "Загрузка...", | |
| reload: "Перазагрузіць", | |
| verify: "Праверыць", | |
| verificationRequired: "Патрабуецца праверка!", | |
| verified: "Праверана", | |
| verifying: "Правяраем...", | |
| waitAlert: "Праверка... калі ласка, пачакайце.", | |
| cancel: "Скасаваць", | |
| enterCodeFromImage: "Каб працягнуць, увядзіце код з малюнка ніжэй." | |
| }; | |
| globalThis.$altcha.i18n.set("be", i18n$W); | |
| const i18n$V = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspjela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak, molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("bs", i18n$V); | |
| const i18n$U = { | |
| ariaLinkLabel: "Altcha (lloc web oficial)", | |
| enterCode: "Introdueix el codi", | |
| enterCodeAria: "Introdueix el codi que escoltes. Prem Espai per reproduir l’àudio.", | |
| error: "Verificació fallida. Torna-ho a provar més tard.", | |
| expired: "Verificació expirada. Torna-ho a provar.", | |
| footer: 'Protegit per <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (lloc web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un desafiament d’àudio", | |
| label: "No sóc un robot", | |
| loading: "Carregant...", | |
| reload: "Torna a carregar", | |
| verify: "Verificar", | |
| verificationRequired: "Es requereix verificació!", | |
| verified: "Verificat", | |
| verifying: "Verificant...", | |
| waitAlert: "Verificant... si us plau, espera.", | |
| cancel: "Cancel·la", | |
| enterCodeFromImage: "Per continuar, si us plau, introdueix el codi de la imatge següent." | |
| }; | |
| globalThis.$altcha.i18n.set("ca", i18n$U); | |
| const i18n$T = { | |
| ariaLinkLabel: "Altcha (oficiální web)", | |
| enterCode: "Zadejte kód", | |
| enterCodeAria: "Zadejte kód, který slyšíte. Stisknutím mezerníku přehrajete zvuk.", | |
| error: "Ověření selhalo. Zkuste to prosím později.", | |
| expired: "Ověření vypršelo. Zkuste to prosím znovu.", | |
| footer: 'Chráněno pomocí <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiální web)">ALTCHA</a>', | |
| getAudioChallenge: "Získat audio výzvu", | |
| label: "Nejsem robot", | |
| loading: "Načítání...", | |
| reload: "Znovu načíst", | |
| verify: "Ověřit", | |
| verificationRequired: "Vyžaduje se ověření!", | |
| verified: "Ověřeno", | |
| verifying: "Ověřování...", | |
| waitAlert: "Probíhá ověření... prosím počkejte.", | |
| cancel: "Zrušit", | |
| enterCodeFromImage: "Pro pokračování zadejte kód z obrázku níže." | |
| }; | |
| globalThis.$altcha.i18n.set("cs", i18n$T); | |
| const i18n$S = { | |
| ariaLinkLabel: "Altcha (officiel hjemmeside)", | |
| enterCode: "Indtast kode", | |
| enterCodeAria: "Indtast den kode, du hører. Tryk på mellemrumstasten for at afspille lyd.", | |
| error: "Verificering mislykkedes. Prøv venligst igen senere.", | |
| expired: "Verificering udløbet. Prøv venligst igen.", | |
| footer: 'Beskyttet af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiel hjemmeside)">ALTCHA</a>', | |
| getAudioChallenge: "Hent lydudfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Indlæser...", | |
| reload: "Genindlæs", | |
| verify: "Verificer", | |
| verificationRequired: "Verificering kræves!", | |
| verified: "Verificeret", | |
| verifying: "Verificerer...", | |
| waitAlert: "Verificerer... vent venligst.", | |
| cancel: "Annuller", | |
| enterCodeFromImage: "For at fortsætte, bedes du indtaste koden fra billedet herunder." | |
| }; | |
| globalThis.$altcha.i18n.set("da", i18n$S); | |
| const i18n$R = { | |
| ariaLinkLabel: "Altcha (offizielle Website)", | |
| enterCode: "Code eingeben", | |
| enterCodeAria: "Geben Sie den Code ein, den Sie hören. Drücken Sie die Leertaste, um die Audio abzuspielen.", | |
| error: "Überprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.", | |
| expired: "Überprüfung abgelaufen. Bitte versuchen Sie es erneut.", | |
| footer: 'Geschützt durch <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offizielle Website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-Herausforderung anfordern", | |
| label: "Ich bin kein Roboter", | |
| loading: "Lade...", | |
| reload: "Neu laden", | |
| verify: "Überprüfen", | |
| verificationRequired: "Überprüfung erforderlich!", | |
| verified: "Überprüft", | |
| verifying: "Wird überprüft...", | |
| waitAlert: "Überprüfung läuft... bitte warten.", | |
| cancel: "Abbrechen", | |
| enterCodeFromImage: "Um fortzufahren, geben Sie bitte den Code aus dem Bild unten ein." | |
| }; | |
| globalThis.$altcha.i18n.set("de", i18n$R); | |
| const i18n$Q = { | |
| ariaLinkLabel: "Altcha (επίσημος ιστότοπος)", | |
| enterCode: "Εισαγάγετε κωδικό", | |
| enterCodeAria: "Εισαγάγετε τον κωδικό που ακούτε. Πατήστε Space για να παίξετε τον ήχο.", | |
| error: "Η επαλήθευση απέτυχε. Δοκιμάστε ξανά αργότερα.", | |
| expired: "Η επαλήθευση έληξε. Δοκιμάστε ξανά.", | |
| footer: 'Προστατεύεται από το <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (επίσημος ιστότοπος)">ALTCHA</a>', | |
| getAudioChallenge: "Λήψη ηχητικής δοκιμασίας", | |
| label: "Δεν είμαι ρομπότ", | |
| loading: "Φόρτωση...", | |
| reload: "Επαναφόρτωση", | |
| verify: "Επαλήθευση", | |
| verificationRequired: "Απαιτείται έλεγχος!", | |
| verified: "Επαληθεύτηκε", | |
| verifying: "Γίνεται επαλήθευση...", | |
| waitAlert: "Γίνεται επαλήθευση... παρακαλώ περιμένετε.", | |
| cancel: "Ακύρωση", | |
| enterCodeFromImage: "Για να συνεχίσετε, εισάγετε τον κωδικό από την παρακάτω εικόνα." | |
| }; | |
| globalThis.$altcha.i18n.set("el", i18n$Q); | |
| const i18n$P = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Introduce el código", | |
| enterCodeAria: "Introduce el código que escuchas. Pulsa Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor intente nuevamente más tarde.", | |
| expired: "Verificación expirada. Por favor intente nuevamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un desafío de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Recargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espere.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, introduzca el código de la imagen de abajo." | |
| }; | |
| globalThis.$altcha.i18n.set("es-es", i18n$P); | |
| const i18n$O = { | |
| ariaLinkLabel: "Altcha (sitio web oficial)", | |
| enterCode: "Ingresa el código", | |
| enterCodeAria: "Ingresa el código que escuchas. Presiona Espacio para reproducir el audio.", | |
| error: "Falló la verificación. Por favor vuelve a intentarlo más tarde.", | |
| expired: "La verificación expiró. Por favor inténtalo de nuevo.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sitio web oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obtener un reto de audio", | |
| label: "No soy un robot", | |
| loading: "Cargando...", | |
| reload: "Volver a cargar", | |
| verify: "Verificar", | |
| verificationRequired: "¡Verificación requerida!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor espera.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para continuar, ingresa el código de la imagen a continuación." | |
| }; | |
| globalThis.$altcha.i18n.set("es-419", i18n$O); | |
| const i18n$N = { | |
| ariaLinkLabel: "Altcha (ametlik veebisait)", | |
| enterCode: "Sisesta kood", | |
| enterCodeAria: "Sisestage kuuldu kood. Vajutage tühikut, et esitada heli.", | |
| error: "Kinnitamine ebaõnnestus. Proovi hiljem uuesti.", | |
| expired: "Kinnitamine aegus. Proovi uuesti.", | |
| footer: 'Kaitstud <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ametlik veebisait)">ALTCHA</a> poolt', | |
| getAudioChallenge: "Hangi heliülesanne", | |
| label: "Ma ei ole robot", | |
| loading: "Laadimine...", | |
| reload: "Laadi uuesti", | |
| verify: "Kinnita", | |
| verificationRequired: "Kontroll on vajalik!", | |
| verified: "Kinnitatud", | |
| verifying: "Kinnitamine...", | |
| waitAlert: "Kinnitamine... palun oota.", | |
| cancel: "Tühista", | |
| enterCodeFromImage: "Jätkamiseks sisestage alloleval pildil olev kood." | |
| }; | |
| globalThis.$altcha.i18n.set("et", i18n$N); | |
| const i18n$M = { | |
| ariaLinkLabel: "Altcha (webgune ofiziala)", | |
| enterCode: "Sartu kodea", | |
| enterCodeAria: "Sartu entzun duzun kodea. Sakatu Espazioa audioa erreproduzitzeko.", | |
| error: "Egiaztatzeak huts egin du. Saiatu berriro geroago.", | |
| expired: "Egiaztatzea iraungi da. Saiatu berriro.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (webgune ofiziala)">ALTCHA</a>k babestuta', | |
| getAudioChallenge: "Jaso audio-erronka bat", | |
| label: "Ez naiz robot bat", | |
| loading: "Kargatzen...", | |
| reload: "Birkargatu", | |
| verify: "Egiaztatu", | |
| verificationRequired: "Egiaztatzea beharrezkoa da!", | |
| verified: "Egiaztatuta", | |
| verifying: "Egiaztatzen...", | |
| waitAlert: "Egiaztatzen... itxaron mesedez.", | |
| cancel: "Utzi", | |
| enterCodeFromImage: "Jarraitzeko, idatzi beheko irudiko kodea." | |
| }; | |
| globalThis.$altcha.i18n.set("eu", i18n$M); | |
| const i18n$L = { | |
| ariaLinkLabel: "Altcha (وبسایت رسمی)", | |
| enterCode: "کد را وارد کنید", | |
| enterCodeAria: "کدی که میشنوید را وارد کنید. برای پخش صدا Space را فشار دهید.", | |
| error: "احراز هویت ناموفق بود. بعداً دوباره تلاش کنید.", | |
| expired: "احراز هویت منقضی شد. دوباره تلاش کنید.", | |
| footer: 'محافظت شده توسط <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (وبسایت رسمی)">ALTCHA</a>', | |
| getAudioChallenge: "دریافت چالش صوتی", | |
| label: "من ربات نیستم", | |
| loading: "در حال بارگذاری...", | |
| reload: "بارگذاری مجدد", | |
| verify: "تایید", | |
| verificationRequired: "احراز هویت لازم است!", | |
| verified: "تایید شد", | |
| verifying: "در حال تایید...", | |
| waitAlert: "در حال تایید... لطفا منتظر بمانید.", | |
| cancel: "لغو کردن", | |
| enterCodeFromImage: "برای ادامه، لطفاً کد تصویر زیر را وارد کنید." | |
| }; | |
| globalThis.$altcha.i18n.set("fa", i18n$L); | |
| const i18n$K = { | |
| ariaLinkLabel: "Altcha (offiziell Websäit)", | |
| enterCode: "Code aginn", | |
| enterCodeAria: "Gitt de Code an deen dir héiert. Dréckt op d'Weltraumtast fir Audio ofzespillen.", | |
| error: "Verifikatioun ass feelgeschloen. Probéiert méi spéit nach emol.", | |
| expired: "Verifikatioun ofgelaf. Probéiert nach emol.", | |
| footer: 'Geschützt vun <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offiziell Websäit)">ALTCHA</a>', | |
| getAudioChallenge: "Kritt eng Audio-Herausfuerderung", | |
| label: "Ech sinn keen Robot", | |
| loading: "Lueden...", | |
| reload: "Nei lueden", | |
| verify: "Verifizéieren", | |
| verificationRequired: "Verifikatioun néideg!", | |
| verified: "Verifizéiert", | |
| verifying: "Verifizéieren...", | |
| waitAlert: "Verifizéieren... waart wgl.", | |
| cancel: "Ofbriechen", | |
| enterCodeFromImage: "Fir virun ze fueren, gitt wgl. de Code aus dem Bild hei drënner an." | |
| }; | |
| globalThis.$altcha.i18n.set("lb", i18n$K); | |
| const i18n$J = { | |
| ariaLinkLabel: "Altcha (virallinen verkkosivusto)", | |
| enterCode: "Syötä koodi", | |
| enterCodeAria: "Kirjoita kuulemasi koodi. Paina välilyöntiä toistaaksesi äänen.", | |
| error: "Varmennus epäonnistui. Yritä myöhemmin uudelleen.", | |
| expired: "Varmennus vanhentui. Yritä uudelleen.", | |
| footer: 'Suojattu <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (virallinen verkkosivusto)">ALTCHA</a>:lla', | |
| getAudioChallenge: "Hae äänitehtävä", | |
| label: "En ole robotti", | |
| loading: "Ladataan...", | |
| reload: "Lataa uudelleen", | |
| verify: "Vahvista", | |
| verificationRequired: "Vahvistus vaaditaan!", | |
| verified: "Vahvistettu", | |
| verifying: "Vahvistetaan...", | |
| waitAlert: "Vahvistetaan... odota hetki.", | |
| cancel: "Peruuta", | |
| enterCodeFromImage: "Jatkaaksesi, syötä alla olevan kuvan koodi." | |
| }; | |
| globalThis.$altcha.i18n.set("fi", i18n$J); | |
| const i18n$I = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur la barre d'espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Réessayez plus tard.", | |
| expired: "La vérification a expiré. Réessayez.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-ca", i18n$I); | |
| const i18n$H = { | |
| ariaLinkLabel: "Altcha (site officiel)", | |
| enterCode: "Entrez le code", | |
| enterCodeAria: "Entrez le code que vous entendez. Appuyez sur Espace pour écouter l'audio.", | |
| error: "Échec de la vérification. Essayez à nouveau plus tard.", | |
| expired: "La vérification a expiré. Essayez à nouveau.", | |
| footer: 'Protégé par <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site officiel)">ALTCHA</a>', | |
| getAudioChallenge: "Obtenir un défi audio", | |
| label: "Je ne suis pas un robot", | |
| loading: "Chargement...", | |
| reload: "Recharger", | |
| verify: "Vérifier", | |
| verificationRequired: "Vérification requise !", | |
| verified: "Vérifié", | |
| verifying: "Vérification en cours...", | |
| waitAlert: "Vérification en cours... veuillez patienter.", | |
| cancel: "Annuler", | |
| enterCodeFromImage: "Pour continuer, veuillez entrer le code de l'image ci-dessous." | |
| }; | |
| globalThis.$altcha.i18n.set("fr-fr", i18n$H); | |
| const i18n$G = { | |
| ariaLinkLabel: "Altcha (láithreán gréasáin oifigiúil)", | |
| enterCode: "Iontráil cód", | |
| enterCodeAria: "Cuir isteach an cód a chloiseann tú. Brúigh Spás chun an fuaime a sheinm.", | |
| error: "Theip ar an bhfíorú. Bain triail eile as níos déanaí.", | |
| expired: "Tá an fíorú as feidhm. Bain triail eile as.", | |
| footer: 'Cosanta ag <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (láithreán gréasáin oifigiúil)">ALTCHA</a>', | |
| getAudioChallenge: "Faigh dúshlán fuaime", | |
| label: "Níl mé i mo róbat", | |
| loading: "Á luchtú...", | |
| reload: "Athluchtaigh", | |
| verify: "Fíoraigh", | |
| verificationRequired: "Fíorú riachtanach!", | |
| verified: "Fíoraithe", | |
| verifying: "Fíorú ar siúl...", | |
| waitAlert: "Fíorú ar siúl... fan go fóill.", | |
| cancel: "Cealaigh", | |
| enterCodeFromImage: "Chun dul ar aghaidh, le do thoil cuir isteach an cód ón íomhá thíos." | |
| }; | |
| globalThis.$altcha.i18n.set("ga", i18n$G); | |
| const i18n$F = { | |
| ariaLinkLabel: "Altcha (službena web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite razmaknicu za reprodukciju zvuka.", | |
| error: "Provjera nije uspjela. Molimo pokušajte kasnije.", | |
| expired: "Provjera je istekla. Molimo pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (službena web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Audio provjera", | |
| label: "Ja nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovno učitaj", | |
| verify: "Provjeri", | |
| verificationRequired: "Potrebna je provjera!", | |
| verified: "Provjereno", | |
| verifying: "Provjeravanje...", | |
| waitAlert: "Provjera je u tijeku... molimo pričekajte.", | |
| cancel: "Odustani", | |
| enterCodeFromImage: "Za nastavak molimo unesite kod sa slike ispod." | |
| }; | |
| globalThis.$altcha.i18n.set("hr", i18n$F); | |
| const i18n$E = { | |
| ariaLinkLabel: "Altcha (hivatalos weboldal)", | |
| enterCode: "Írja be a kódot", | |
| enterCodeAria: "Írja be a hallott kódot. Nyomja meg a Szóköz billentyűt a hang lejátszásához.", | |
| error: "A hitelesítés nem sikerült. Próbáld meg később újra.", | |
| expired: "A hitelesítés lejárt. Próbáld újra.", | |
| footer: 'Védve a következő által: <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (hivatalos weboldal)">ALTCHA</a>', | |
| getAudioChallenge: "Hangalapú kihívás kérése", | |
| label: "Nem vagyok robot", | |
| loading: "Betöltés...", | |
| reload: "Újratöltés", | |
| verify: "Ellenőrzés", | |
| verificationRequired: "Ellenőrzés szükséges!", | |
| verified: "Ellenőrizve", | |
| verifying: "Ellenőrzés folyamatban...", | |
| waitAlert: "Ellenőrzés folyamatban... kérlek várj.", | |
| cancel: "Mégse", | |
| enterCodeFromImage: "A folytatáshoz, kérjük, adja meg az alábbi kép kódját." | |
| }; | |
| globalThis.$altcha.i18n.set("hu", i18n$E); | |
| const i18n$D = { | |
| ariaLinkLabel: "Altcha (opinber vefsíða)", | |
| enterCode: "Sláðu inn kóða", | |
| enterCodeAria: "Sláðu inn kóðann sem þú heyrir. Ýttu á Space til að spila hljóðið.", | |
| error: "Staðfesting mistókst. Reyndu aftur síðar.", | |
| expired: "Staðfesting er útrunnin. Reyndu aftur.", | |
| footer: 'Verndað af <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (opinber vefsíða)">ALTCHA</a>', | |
| getAudioChallenge: "Fá hljóðáskorun", | |
| label: "Ég er ekki robot", | |
| loading: "Hleður...", | |
| reload: "Hleð aftur", | |
| verify: "Staðfesta", | |
| verificationRequired: "Staðfesting er nauðsynleg!", | |
| verified: "Staðfest", | |
| verifying: "Að staðfesta...", | |
| waitAlert: "Að staðfesta... vinsamlegast bíða.", | |
| cancel: "Hætta við", | |
| enterCodeFromImage: "Til að halda áfram, vinsamlegast sláðu inn kóðann af myndinni hér að neðan." | |
| }; | |
| globalThis.$altcha.i18n.set("is", i18n$D); | |
| const i18n$C = { | |
| ariaLinkLabel: "Altcha (sito ufficiale)", | |
| enterCode: "Inserisci il codice", | |
| enterCodeAria: "Inserisci il codice che senti. Premi Spazio per riprodurre l'audio.", | |
| error: "Verifica fallita. Riprova più tardi.", | |
| expired: "Verifica scaduta. Riprova.", | |
| footer: 'Protetto da <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sito ufficiale)">ALTCHA</a>', | |
| getAudioChallenge: "Ottieni una sfida audio", | |
| label: "Non sono un robot", | |
| loading: "Caricamento...", | |
| reload: "Ricarica", | |
| verify: "Verifica", | |
| verificationRequired: "Verifica richiesta!", | |
| verified: "Verificato", | |
| verifying: "Verifica in corso...", | |
| waitAlert: "Verifica in corso... attendere.", | |
| cancel: "Annulla", | |
| enterCodeFromImage: "Per procedere, inserisci il codice dall'immagine sottostante." | |
| }; | |
| globalThis.$altcha.i18n.set("it", i18n$C); | |
| const i18n$B = { | |
| ariaLinkLabel: "Altcha (oficiali svetainė)", | |
| enterCode: "Įveskite kodą", | |
| enterCodeAria: "Įveskite girdimą kodą. Paspauskite tarpo klavišą, kad grotumėte garso įrašą.", | |
| error: "Patvirtinimas nepavyko. Bandykite vėliau.", | |
| expired: "Patvirtinimo laikas baigėsi. Bandykite dar kartą.", | |
| footer: 'Apsaugota <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiali svetainė)">ALTCHA</a>', | |
| getAudioChallenge: "Gauti garso užduotį", | |
| label: "Aš nesu robotas", | |
| loading: "Įkeliama...", | |
| reload: "Įkelti iš naujo", | |
| verify: "Patvirtinti", | |
| verificationRequired: "Reikalingas patvirtinimas!", | |
| verified: "Patvirtinta", | |
| verifying: "Tikrinama...", | |
| waitAlert: "Tikrinama... prašome palaukti.", | |
| cancel: "Atšaukti", | |
| enterCodeFromImage: "Norėdami tęsti, įveskite kodą iš paveikslėlio žemiau." | |
| }; | |
| globalThis.$altcha.i18n.set("lt", i18n$B); | |
| const i18n$A = { | |
| ariaLinkLabel: "Altcha (oficiālā tīmekļa vietne)", | |
| enterCode: "Ievadiet kodu", | |
| enterCodeAria: "Ievadiet dzirdamo kodu. Nospiediet atstarpes taustiņu, lai atskaņotu audio.", | |
| error: "Verifikācija neizdevās. Mēģiniet vēlāk vēlreiz.", | |
| expired: "Verifikācijas laiks ir beidzies. Mēģiniet vēlreiz.", | |
| footer: 'Aizsargāts ar <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiālā tīmekļa vietne)">ALTCHA</a>', | |
| getAudioChallenge: "Saņemt audio izaicinājumu", | |
| label: "Es neesmu robots", | |
| loading: "Notiek ielāde...", | |
| reload: "Pārlādēt", | |
| verify: "Verificēt", | |
| verificationRequired: "Nepieciešama verifikācija!", | |
| verified: "Verificēts", | |
| verifying: "Notiek verifikācija...", | |
| waitAlert: "Notiek verifikācija... lūdzu, uzgaidiet.", | |
| cancel: "Atcelt", | |
| enterCodeFromImage: "Lai turpinātu, lūdzu, ievadiet zemāk redzamo attēlu kodu." | |
| }; | |
| globalThis.$altcha.i18n.set("lv", i18n$A); | |
| const i18n$z = { | |
| ariaLinkLabel: "Altcha (sit uffiċjali)", | |
| enterCode: "Idħol il-kodiċi", | |
| enterCodeAria: "Idħol il-kodiċi li tisma'. Agħfas Spazju biex tindaqq l-awdjo.", | |
| error: "Il-verifika falliet. Erġa’ pprova aktar tard.", | |
| expired: "Il-verifika skadiet. Erġa’ pprova.", | |
| footer: 'Protett minn <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (sit uffiċjali)">ALTCHA</a>', | |
| getAudioChallenge: "Ikseb sfida bl-awdjo", | |
| label: "M’inix robot", | |
| loading: "Qed jitgħabba...", | |
| reload: "Ittella’ mill-ġdid", | |
| verify: "Ivverifika", | |
| verificationRequired: "Verifika meħtieġa!", | |
| verified: "Ivverifikat", | |
| verifying: "Verifika għaddejja...", | |
| waitAlert: "Verifika għaddejja... stenna ftit.", | |
| cancel: "Ikkanċella", | |
| enterCodeFromImage: "Biex tipproċedi, jekk jogħġbok daħħal il-kodiċi mill-immaġni hawn taħt." | |
| }; | |
| globalThis.$altcha.i18n.set("mt", i18n$z); | |
| const i18n$y = { | |
| ariaLinkLabel: "Altcha (offisiell nettside)", | |
| enterCode: "Skriv inn kode", | |
| enterCodeAria: "Skriv inn koden du hører. Trykk på Space for å spille av lyden.", | |
| error: "Verifisering mislyktes. Prøv igjen senere.", | |
| expired: "Verifiseringen utløp. Prøv igjen.", | |
| footer: 'Beskyttet av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (offisiell nettside)">ALTCHA</a>', | |
| getAudioChallenge: "Få en lydutfordring", | |
| label: "Jeg er ikke en robot", | |
| loading: "Laster...", | |
| reload: "Last på nytt", | |
| verify: "Verifiser", | |
| verificationRequired: "Verifisering kreves!", | |
| verified: "Verifisert", | |
| verifying: "Verifiserer...", | |
| waitAlert: "Verifiserer... vennligst vent.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "For å fortsette, vennligst skriv inn koden fra bildet nedenfor." | |
| }; | |
| globalThis.$altcha.i18n.set("nb", i18n$y); | |
| const i18n$x = { | |
| ariaLinkLabel: "Altcha (officiële website)", | |
| enterCode: "Voer code in", | |
| enterCodeAria: "Voer de code in die je hoort. Druk op Spatie om de audio af te spelen.", | |
| error: "Verificatie mislukt. Probeer het later opnieuw.", | |
| expired: "Verificatie verlopen. Probeer het opnieuw.", | |
| footer: 'Beschermd door <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiële website)">ALTCHA</a>', | |
| getAudioChallenge: "Audio-uitdaging ontvangen", | |
| label: "Ik ben geen robot", | |
| loading: "Laden...", | |
| reload: "Herladen", | |
| verify: "Verifiëren", | |
| verificationRequired: "Verificatie vereist!", | |
| verified: "Geverifieerd", | |
| verifying: "Bezig met verifiëren...", | |
| waitAlert: "Bezig met verifiëren... even geduld a.u.b.", | |
| cancel: "Annuleren", | |
| enterCodeFromImage: "Om door te gaan, voert u de code uit de onderstaande afbeelding in." | |
| }; | |
| globalThis.$altcha.i18n.set("nl", i18n$x); | |
| const i18n$w = { | |
| ariaLinkLabel: "Altcha (oficjalna strona internetowa)", | |
| enterCode: "Wprowadź kod", | |
| enterCodeAria: "Wpisz kod, który słyszysz. Naciśnij Spację, aby odtworzyć dźwięk.", | |
| error: "Weryfikacja nie powiodła się. Spróbuj ponownie później.", | |
| expired: "Weryfikacja wygasła. Spróbuj ponownie.", | |
| footer: 'Chronione przez <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficjalna strona internetowa)">ALTCHA</a>', | |
| getAudioChallenge: "Pobierz zadanie dźwiękowe", | |
| label: "Nie jestem robotem", | |
| loading: "Ładowanie...", | |
| reload: "Odśwież", | |
| verify: "Zweryfikuj", | |
| verificationRequired: "Wymagana weryfikacja!", | |
| verified: "Zweryfikowano", | |
| verifying: "Weryfikacja...", | |
| waitAlert: "Trwa weryfikacja... proszę czekać.", | |
| cancel: "Anuluj", | |
| enterCodeFromImage: "Aby kontynuować, wprowadź kod z poniższego obrazka." | |
| }; | |
| globalThis.$altcha.i18n.set("pl", i18n$w); | |
| const i18n$v = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduza o código", | |
| enterCodeAria: "Introduza o código que ouve. Prima Espaço para reproduzir o áudio.", | |
| error: "A verificação falhou. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Não sou um robô", | |
| loading: "A carregar...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "A verificar...", | |
| waitAlert: "A verificar... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, introduza o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-pt", i18n$v); | |
| const i18n$u = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Digite o código", | |
| enterCodeAria: "Digite o código que você ouve. Pressione Espaço para reproduzir o áudio.", | |
| error: "Falha na verificação. Por favor, tente novamente mais tarde.", | |
| expired: "Verificação expirada. Por favor, tente novamente.", | |
| footer: 'Protegido por <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obter desafio de áudio", | |
| label: "Eu não sou um robô", | |
| loading: "Carregando...", | |
| reload: "Recarregar", | |
| verify: "Verificar", | |
| verificationRequired: "Verificação necessária!", | |
| verified: "Verificado", | |
| verifying: "Verificando...", | |
| waitAlert: "Verificando... por favor aguarde.", | |
| cancel: "Cancelar", | |
| enterCodeFromImage: "Para prosseguir, digite o código da imagem abaixo." | |
| }; | |
| globalThis.$altcha.i18n.set("pt-br", i18n$u); | |
| const i18n$t = { | |
| ariaLinkLabel: "Altcha (site oficial)", | |
| enterCode: "Introduceți codul", | |
| enterCodeAria: "Introduceți codul pe care îl auziți. Apăsați Spațiu pentru a reda audio.", | |
| error: "Verificarea a eșuat. Încearcă din nou mai târziu.", | |
| expired: "Verificarea a expirat. Încearcă din nou.", | |
| footer: 'Protejat de <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (site oficial)">ALTCHA</a>', | |
| getAudioChallenge: "Obține o provocare audio", | |
| label: "Nu sunt un robot", | |
| loading: "Se încarcă...", | |
| reload: "Reîncarcă", | |
| verify: "Verifică", | |
| verificationRequired: "Verificare necesară!", | |
| verified: "Verificat", | |
| verifying: "Se verifică...", | |
| waitAlert: "Se verifică... te rugăm să aștepți.", | |
| cancel: "Anulare", | |
| enterCodeFromImage: "Pentru a continua, vă rugăm să introduceți codul din imaginea de mai jos." | |
| }; | |
| globalThis.$altcha.i18n.set("ro", i18n$t); | |
| const i18n$s = { | |
| ariaLinkLabel: "Altcha (официальный сайт)", | |
| enterCode: "Введите код", | |
| enterCodeAria: "Введите код, который слышите. Нажмите пробел для воспроизведения аудио.", | |
| error: "Ошибка верификации. Попробуйте позже.", | |
| expired: "Срок действия верификации истек. Попробуйте снова.", | |
| footer: 'Защищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (официальный сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Получить аудио задачу", | |
| label: "Я не робот", | |
| loading: "Загрузка...", | |
| reload: "Перезагрузить", | |
| verify: "Проверить", | |
| verificationRequired: "Требуется проверка!", | |
| verified: "Проверено", | |
| verifying: "Идет проверка...", | |
| waitAlert: "Идет проверка... Пожалуйста, подождите.", | |
| cancel: "Отмена", | |
| enterCodeFromImage: "Чтобы продолжить, пожалуйста, введите код с изображения ниже." | |
| }; | |
| globalThis.$altcha.i18n.set("ru", i18n$s); | |
| const i18n$r = { | |
| ariaLinkLabel: "Altcha (oficiálna webová stránka)", | |
| enterCode: "Zadajte kód", | |
| enterCodeAria: "Zadajte kód, ktorý počujete. Stlačením medzerníka prehráte zvuk.", | |
| error: "Verifikácia zlyhala. Skúste to znova neskôr.", | |
| expired: "Verifikácia vypršala. Skúste to znova.", | |
| footer: 'Chránené <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oficiálna webová stránka)">ALTCHA</a>', | |
| getAudioChallenge: "Získať audio výzvu", | |
| label: "Nie som robot", | |
| loading: "Načítava sa...", | |
| reload: "Obnoviť", | |
| verify: "Verifikovať", | |
| verificationRequired: "Vyžaduje sa overenie!", | |
| verified: "Verifikované", | |
| verifying: "Prebieha verifikácia...", | |
| waitAlert: "Prebieha verifikácia... prosím čakajte.", | |
| cancel: "Zrušiť", | |
| enterCodeFromImage: "Na pokračovanie, prosím, zadajte kód z obrázka nižšie." | |
| }; | |
| globalThis.$altcha.i18n.set("sk", i18n$r); | |
| const i18n$q = { | |
| ariaLinkLabel: "Altcha (uradna spletna stran)", | |
| enterCode: "Vnesite kodo", | |
| enterCodeAria: "Vnesite kodo, ki jo slišite. Pritisnite preslednico za predvajanje zvoka.", | |
| error: "Preverjanje ni uspelo. Poskusite znova kasneje.", | |
| expired: "Preverjanje je poteklo. Poskusite znova.", | |
| footer: 'Zaščiteno z <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (uradna spletna stran)">ALTCHA</a>', | |
| getAudioChallenge: "Pridobite zvočni izziv", | |
| label: "Nisem robot", | |
| loading: "Nalagam...", | |
| reload: "Ponovno naloži", | |
| verify: "Preveri", | |
| verificationRequired: "Potrebna je preveritev!", | |
| verified: "Preverjeno", | |
| verifying: "Preverjanje...", | |
| waitAlert: "Preverjanje... prosim počakajte.", | |
| cancel: "Preklic", | |
| enterCodeFromImage: "Za nadaljevanje, prosimo, vnesite kodo s slike spodaj." | |
| }; | |
| globalThis.$altcha.i18n.set("sl", i18n$q); | |
| const i18n$p = { | |
| ariaLinkLabel: "Altcha (faqja zyrtare)", | |
| enterCode: "Fut kodin", | |
| enterCodeAria: "Fut kodin që dëgjon. Shtypni Hapësirë për të luajtur audio.", | |
| error: "Verifikimi dështoi. Provoni përsëri më vonë.", | |
| expired: "Verifikimi ka skaduar. Provoni përsëri.", | |
| footer: 'I mbrojtur nga <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (faqja zyrtare)">ALTCHA</a>', | |
| getAudioChallenge: "Merr një sfidë audio", | |
| label: "Unë nuk jam një robot", | |
| loading: "Duke u ngarkuar...", | |
| reload: "Ringarko", | |
| verify: "Verifiko", | |
| verificationRequired: "Kërkohet verifikimi!", | |
| verified: "I verifikuar", | |
| verifying: "Duke verifikuar...", | |
| waitAlert: "Duke verifikuar... ju lutem prisni.", | |
| cancel: "Anuloje", | |
| enterCodeFromImage: "Për të vazhduar, ju lutemi fusni kodin nga imazhi më poshtë." | |
| }; | |
| globalThis.$altcha.i18n.set("sq", i18n$p); | |
| const i18n$o = { | |
| ariaLinkLabel: "Altcha (zvanična web stranica)", | |
| enterCode: "Unesite kod", | |
| enterCodeAria: "Unesite kod koji čujete. Pritisnite Space da biste pustili zvuk.", | |
| error: "Verifikacija nije uspela. Pokušajte ponovo kasnije.", | |
| expired: "Verifikacija je istekla. Pokušajte ponovo.", | |
| footer: 'Zaštićeno od strane <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (zvanična web stranica)">ALTCHA</a>', | |
| getAudioChallenge: "Dohvatite audio izazov", | |
| label: "Nisam robot", | |
| loading: "Učitavanje...", | |
| reload: "Ponovo učitaj", | |
| verify: "Verifikuj", | |
| verificationRequired: "Verifikacija je obavezna!", | |
| verified: "Verifikovano", | |
| verifying: "Verifikacija u toku...", | |
| waitAlert: "Verifikacija u toku... molimo vas da sačekate.", | |
| cancel: "Откажи", | |
| enterCodeFromImage: "Да бисте наставили, унесите код са слике испод." | |
| }; | |
| globalThis.$altcha.i18n.set("sr", i18n$o); | |
| const i18n$n = { | |
| ariaLinkLabel: "Altcha (officiell webbplats)", | |
| enterCode: "Ange kod", | |
| enterCodeAria: "Ange koden du hör. Tryck på mellanslag för att spela upp ljudet.", | |
| error: "Verifiering misslyckades. Försök igen senare.", | |
| expired: "Verifieringen har gått ut. Försök igen.", | |
| footer: 'Skyddad av <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (officiell webbplats)">ALTCHA</a>', | |
| getAudioChallenge: "Få ljudutmaning", | |
| label: "Jag är inte en robot", | |
| loading: "Laddar...", | |
| reload: "Ladda om", | |
| verify: "Verifiera", | |
| verificationRequired: "Verifiering krävs!", | |
| verified: "Verifierad", | |
| verifying: "Verifierar...", | |
| waitAlert: "Verifierar... vänligen vänta.", | |
| cancel: "Avbryt", | |
| enterCodeFromImage: "För att fortsätta, ange koden från bilden nedan." | |
| }; | |
| globalThis.$altcha.i18n.set("sv", i18n$n); | |
| const i18n$m = { | |
| ariaLinkLabel: "Altcha (resmi web sitesi)", | |
| enterCode: "Kodu girin", | |
| enterCodeAria: "Duyduğunuz kodu girin. Ses dosyasını oynatmak için Boşluk tuşuna basın.", | |
| error: "Doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyin.", | |
| expired: "Doğrulama süresi doldu. Lütfen tekrar deneyin.", | |
| footer: 'ALTCHA tarafından korunuyor <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (resmi web sitesi)">ALTCHA</a>', | |
| getAudioChallenge: "Sesli doğrulama al", | |
| label: "Ben robot değilim", | |
| loading: "Yükleniyor...", | |
| reload: "Yeniden yükle", | |
| verify: "Doğrula", | |
| verificationRequired: "Doğrulama gerekli!", | |
| verified: "Doğrulandı", | |
| verifying: "Doğrulama yapılıyor...", | |
| waitAlert: "Doğrulama yapılıyor... lütfen bekleyin.", | |
| cancel: "İptal", | |
| enterCodeFromImage: "Devam etmek için lütfen aşağıdaki resimdeki kodu girin." | |
| }; | |
| globalThis.$altcha.i18n.set("tr", i18n$m); | |
| const i18n$l = { | |
| ariaLinkLabel: "Altcha (офіційний сайт)", | |
| enterCode: "Введіть код", | |
| enterCodeAria: "Введіть код, який ви чуєте. Натисніть пробіл, щоб відтворити аудіо.", | |
| error: "Перевірка не вдалася. Спробуйте пізніше.", | |
| expired: "Перевірка прострочена. Спробуйте знову.", | |
| footer: 'Захищено <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (офіційний сайт)">ALTCHA</a>', | |
| getAudioChallenge: "Отримати аудіо-челлендж", | |
| label: "Я не робот", | |
| loading: "Завантаження...", | |
| reload: "Перезавантажити", | |
| verify: "Перевірити", | |
| verificationRequired: "Потрібна перевірка!", | |
| verified: "Перевірено", | |
| verifying: "Перевіряється...", | |
| waitAlert: "Перевірка... будь ласка, зачекайте.", | |
| cancel: "Скасувати", | |
| enterCodeFromImage: "Щоб продовжити, введіть код із зображення нижче." | |
| }; | |
| globalThis.$altcha.i18n.set("uk", i18n$l); | |
| const i18n$k = { | |
| ariaLinkLabel: "Altcha (amptelike webwerf)", | |
| enterCode: "Voer kode in", | |
| enterCodeAria: "Voer die kode in wat jy hoor. Druk Spasie om die klank af te speel.", | |
| error: "Verifikasie het misluk. Probeer later weer.", | |
| expired: "Verifikasie het verval. Probeer weer.", | |
| footer: 'Beskerm deur <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (amptelike webwerf)">ALTCHA</a>', | |
| getAudioChallenge: "Kry 'n klankuitdaging", | |
| label: "Ek is nie 'n robot nie", | |
| loading: "Laai...", | |
| reload: "Laai weer", | |
| verify: "Verifieer", | |
| verificationRequired: "Verifikasie is vereis!", | |
| verified: "Geverifieer", | |
| verifying: "Verifieer...", | |
| waitAlert: "Verifieer... wag asseblief.", | |
| cancel: "Kanselleer", | |
| enterCodeFromImage: "Om voort te gaan, voer asseblief die kode vanaf die onderstaande prentjie in." | |
| }; | |
| globalThis.$altcha.i18n.set("af", i18n$k); | |
| const i18n$j = { | |
| ariaLinkLabel: "Altcha (ዋናው ድህረ ገጽ)", | |
| enterCode: "ኮድ አስገባ", | |
| enterCodeAria: "የሚሰማዎትን ኮድ ያስገቡ። ድምጽ ለመጫወት Space ን ይጫኑ።", | |
| error: "ማረጋገጫ አልተሳካም። በኋላ ላይ እንደገና ይሞክሩ።", | |
| expired: "ማረጋገጫው ጊዜው አልፏል። እንደገና ይሞክሩ።", | |
| footer: 'በ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ዋናው ድህረ ገጽ)">ALTCHA</a> የተጠበቀ', | |
| getAudioChallenge: "የድምጽ ፈተና ያግኙ", | |
| label: "እኔ ሮቦት አይደለሁም", | |
| loading: "በመጫን ላይ...", | |
| reload: "እንደገና ጫን", | |
| verify: "አረጋግጥ", | |
| verificationRequired: "ማረጋገጫ ያስፈልጋል!", | |
| verified: "ተረጋግጧል", | |
| verifying: "በማረጋገጥ ላይ...", | |
| waitAlert: "በማረጋገጥ ላይ... እባክዎ ይጠብቁ።", | |
| cancel: "ይቅር", | |
| enterCodeFromImage: "ለመቀጠል፣ እባክዎን ከታች ካለው ምስል ኮዱን ያስገቡ።" | |
| }; | |
| globalThis.$altcha.i18n.set("am", i18n$j); | |
| const i18n$i = { | |
| ariaLinkLabel: "Altcha (tovuti rasmi)", | |
| enterCode: "Weka nambari", | |
| enterCodeAria: "Weka nambari unayosikia. Bonyeza Space kucheza sauti.", | |
| error: "Uthibitishaji umeshindwa. Jaribu tena baadaye.", | |
| expired: "Uthibitishaji umeisha. Jaribu tena.", | |
| footer: 'Imealindwa na <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (tovuti rasmi)">ALTCHA</a>', | |
| getAudioChallenge: "Pata changamoto ya sauti", | |
| label: "Mimi sio roboti", | |
| loading: "Inapakia...", | |
| reload: "Pakia tena", | |
| verify: "Thibitisha", | |
| verificationRequired: "Uthibitishaji unahitajika!", | |
| verified: "Imethibitishwa", | |
| verifying: "Inathibitisha...", | |
| waitAlert: "Inathibitisha... tafadhali subiri.", | |
| cancel: "Ghairi", | |
| enterCodeFromImage: "Ili kuendelea, tafadhali weka nambari kutoka kwa picha hapa chini." | |
| }; | |
| globalThis.$altcha.i18n.set("sw", i18n$i); | |
| const i18n$h = { | |
| ariaLinkLabel: "Altcha (oju opo wẹẹbu osise)", | |
| enterCode: "Tẹ koodu sii", | |
| enterCodeAria: "Tẹ koodu ti o ngbọ sii. Tẹ Space lati ṣe ohun orin.", | |
| error: "Ìdájọ́kòwò kò ṣẹ́ṣe. Gbiyanju lẹẹkansi ni ọjọ́ iwájú.", | |
| expired: "Ìdájọ́kòwò ti pari. Gbiyanju lẹẹkansi.", | |
| footer: 'Ti wa ni ààbò nipasẹ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (oju opo wẹẹbu osise)">ALTCHA</a>', | |
| getAudioChallenge: "Gba ìjàdú ohùn", | |
| label: "Emi kii ṣe ẹrọ", | |
| loading: "Ó ń gbé sílẹ̀...", | |
| reload: "Tún gbé wọlé", | |
| verify: "Ṣàdájọ́", | |
| verificationRequired: "Ìdájọ́kòwò ni a nílò!", | |
| verified: "A ti dájọ́", | |
| verifying: "Ó ń ṣàdájọ́...", | |
| waitAlert: "Ó ń ṣàdájọ́... ẹ jọ̀ọ́ ẹ duro.", | |
| cancel: "Fagbọsẹ", | |
| enterCodeFromImage: "Lati tẹsiwaju, jọwọ tẹ koodu ti o wa lati aworan isalẹ sii." | |
| }; | |
| globalThis.$altcha.i18n.set("yo", i18n$h); | |
| const i18n$g = { | |
| ariaLinkLabel: "Altcha (অফিসিয়াল ওয়েবসাইট)", | |
| enterCode: "কোড লিখুন", | |
| enterCodeAria: "আপনি যে কোড শুনতে পান তা লিখুন। অডিও প্লে করতে স্পেস বাটন টিপুন।", | |
| error: "যাচাইকরণ ব্যর্থ হয়েছে। পরে আবার চেষ্টা করুন।", | |
| expired: "যাচাইকরণ সময়সীমা শেষ হয়েছে। আবার চেষ্টা করুন।", | |
| footer: 'দ্বারা সুরক্ষিত <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (অফিসিয়াল ওয়েবসাইট)">ALTCHA</a>', | |
| getAudioChallenge: "অডিও চ্যালেঞ্জ নিন", | |
| label: "আমি রোবট নই", | |
| loading: "লোড হচ্ছে...", | |
| reload: "পুনরায় লোড করুন", | |
| verify: "যাচাই করুন", | |
| verificationRequired: "যাচাই প্রয়োজন!", | |
| verified: "যাচাই করা হয়েছে", | |
| verifying: "যাচাই করা হচ্ছে...", | |
| waitAlert: "যাচাই করা হচ্ছে... দয়া করে অপেক্ষা করুন।", | |
| cancel: "বাতিল করুন", | |
| enterCodeFromImage: "এগিয়ে যেতে, অনুগ্রহ করে নীচের চিত্র থেকে কোডটি প্রবেশ করান।" | |
| }; | |
| globalThis.$altcha.i18n.set("bn", i18n$g); | |
| const i18n$f = { | |
| ariaLinkLabel: "Altcha (אתר רשמי)", | |
| enterCode: "הזן קוד", | |
| enterCodeAria: "הזן את הקוד שאתה שומע. לחץ על רווח להפעלת השמע.", | |
| error: "האימות נכשל. נסה שוב מאוחר יותר.", | |
| expired: "תוקף האימות פג. נסה שוב.", | |
| footer: 'מוגן על ידי <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (אתר רשמי)">ALTCHA</a>', | |
| getAudioChallenge: "קבל אתגר שמע", | |
| label: "אני לא רובוט", | |
| loading: "טוען...", | |
| reload: "טען מחדש", | |
| verify: "אמת", | |
| verificationRequired: "נדרש אימות!", | |
| verified: "אומת", | |
| verifying: "מאמת...", | |
| waitAlert: "מבצע אימות... אנא המתן.", | |
| cancel: "ביטול", | |
| enterCodeFromImage: "כדי להמשיך, אנא הזן את הקוד מהתמונה למטה." | |
| }; | |
| globalThis.$altcha.i18n.set("he", i18n$f); | |
| const i18n$e = { | |
| ariaLinkLabel: "Altcha (आधिकारिक वेबसाइट)", | |
| enterCode: "कोड दर्ज करेंं", | |
| enterCodeAria: "आप जो कोड सुनते हैं उसे दर्ज करें। ऑडियो चलाने के लिए स्पेस दबाएं।", | |
| error: "सत्यापन विफल। कृपया बाद में फिर से प्रयास करें।", | |
| expired: "सत्यापन समाप्त हो गया है। कृपया पुनः प्रयास करें।", | |
| footer: 'द्वारा संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (आधिकारिक वेबसाइट)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडियो चुनौती प्राप्त करें", | |
| label: "मैं रोबोट नहीं हूँ", | |
| loading: "लोड हो रहा है...", | |
| reload: "पुनः लोड करें", | |
| verify: "सत्यापित करें", | |
| verificationRequired: "सत्यापन आवश्यक है!", | |
| verified: "सत्यापित", | |
| verifying: "सत्यापित कर रहे हैं...", | |
| waitAlert: "सत्यापित किया जा रहा है... कृपया प्रतीक्षा करें।", | |
| cancel: "रद्द करें", | |
| enterCodeFromImage: "आगे बढ़ने के लिए, कृपया नीचे दी गई छवि से कोड दर्ज करें।" | |
| }; | |
| globalThis.$altcha.i18n.set("hi", i18n$e); | |
| const i18n$d = { | |
| ariaLinkLabel: "Altcha (situs web resmi)", | |
| enterCode: "Masukkan kode", | |
| enterCodeAria: "Masukkan kode yang Anda dengar. Tekan Spasi untuk memutar audio.", | |
| error: "Verifikasi gagal. Coba lagi nanti.", | |
| expired: "Verifikasi telah kedaluwarsa. Coba lagi.", | |
| footer: 'Dilindungi oleh <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (situs web resmi)">ALTCHA</a>', | |
| getAudioChallenge: "Dapatkan tantangan audio", | |
| label: "Saya bukan robot", | |
| loading: "Memuat...", | |
| reload: "Muat ulang", | |
| verify: "Verifikasi", | |
| verificationRequired: "Verifikasi diperlukan!", | |
| verified: "Terverifikasi", | |
| verifying: "Memverifikasi...", | |
| waitAlert: "Memverifikasi... harap tunggu.", | |
| cancel: "Batal", | |
| enterCodeFromImage: "Untuk melanjutkan, silakan masukkan kode dari gambar di bawah ini." | |
| }; | |
| globalThis.$altcha.i18n.set("id", i18n$d); | |
| const i18n$c = { | |
| ariaLinkLabel: "Altcha (公式ウェブサイト)", | |
| enterCode: "コードを入力", | |
| enterCodeAria: "聞こえるコードを入力してください。スペースキーを押して音声を再生します。", | |
| error: "認証に失敗しました。後でもう一度試してください。", | |
| expired: "認証が期限切れです。再試行してください。", | |
| footer: '保護されています <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (公式ウェブサイト)">ALTCHA</a>', | |
| getAudioChallenge: "音声チャレンジを取得", | |
| label: "私はロボットではありません", | |
| loading: "読み込み中...", | |
| reload: "再読み込み", | |
| verify: "確認", | |
| verificationRequired: "認証が必要です!", | |
| verified: "確認済み", | |
| verifying: "確認中...", | |
| waitAlert: "確認中...少々お待ちください。", | |
| cancel: "キャンセル", | |
| enterCodeFromImage: "続行するには、以下の画像からコードを入力してください。" | |
| }; | |
| globalThis.$altcha.i18n.set("ja", i18n$c); | |
| const i18n$b = { | |
| ariaLinkLabel: "Altcha (공식 웹사이트)", | |
| enterCode: "코드 입력", | |
| enterCodeAria: "들리는 코드를 입력하세요. 스페이스 바를 눌러 오디오를 재생합니다.", | |
| error: "인증 실패. 나중에 다시 시도해주세요.", | |
| expired: "인증이 만료되었습니다. 다시 시도해주세요.", | |
| footer: 'ALTCHA에서 보호됨 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (공식 웹사이트)">ALTCHA</a>', | |
| getAudioChallenge: "오디오 챌린지 받기", | |
| label: "저는 로봇이 아닙니다", | |
| loading: "로딩 중...", | |
| reload: "새로 고침", | |
| verify: "확인", | |
| verificationRequired: "인증이 필요합니다!", | |
| verified: "확인됨", | |
| verifying: "확인 중...", | |
| waitAlert: "확인 중... 잠시만 기다려주세요.", | |
| cancel: "취소", | |
| enterCodeFromImage: "계속 진행하려면 아래 이미지에서 코드를 입력하세요." | |
| }; | |
| globalThis.$altcha.i18n.set("ko", i18n$b); | |
| const i18n$a = { | |
| ariaLinkLabel: "Altcha (ресми веб-сайт)", | |
| enterCode: "Кодты енгізіңіз", | |
| enterCodeAria: "Естіген кодыңызды енгізіңіз. Аудионы ойнату үшін Бос орынды басыңыз.", | |
| error: "Тексеру сәтсіз аяқталды. Кейінірек қайталаңыз.", | |
| expired: "Тексеру мерзімі аяқталды. Қайталаңыз.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (ресми веб-сайт)">ALTCHA</a> қорғайды', | |
| getAudioChallenge: "Аудио сынақ алу", | |
| label: "Мен робот емеспін", | |
| loading: "Жүктелуде...", | |
| reload: "Қайта жүктеу", | |
| verify: "Тексеру", | |
| verificationRequired: "Тексеру талап етіледі!", | |
| verified: "Тексерілді", | |
| verifying: "Тексеруде...", | |
| waitAlert: "Тексерілуде... күте тұрыңыз.", | |
| cancel: "Болдыру", | |
| enterCodeFromImage: "Жалғастыру үшін төмендегі суреттегі кодты енгізіңіз." | |
| }; | |
| globalThis.$altcha.i18n.set("kk", i18n$a); | |
| const i18n$9 = { | |
| ariaLinkLabel: "Altcha (अधिकृत संकेतस्थळ)", | |
| enterCode: "कोड टाकाा", | |
| enterCodeAria: "तुम्ही ऐकत असलेला कोड टाका. ऑडिओ प्ले करण्यासाठी स्पेस दाबा.", | |
| error: "पुष्टीकरण अयशस्वी झाले. कृपया नंतर पुन्हा प्रयत्न करा.", | |
| expired: "पुष्टीकरण कालबाह्य झाले आहे. कृपया पुन्हा प्रयत्न करा.", | |
| footer: 'द्वारे संरक्षित <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (अधिकृत संकेतस्थळ)">ALTCHA</a>', | |
| getAudioChallenge: "ऑडिओ चॅलेंज मिळवा", | |
| label: "मी रोबोट नाही", | |
| loading: "लोड होत आहे...", | |
| reload: "पुन्हा लोड करा", | |
| verify: "पुष्टीकरण करा", | |
| verificationRequired: "पडताळणी आवश्यक आहे!", | |
| verified: "पुष्टीकरण झाले", | |
| verifying: "पुष्टीकरण करत आहे...", | |
| waitAlert: "पुष्टीकरण करत आहे... कृपया थोडा वेळ थांबा.", | |
| cancel: "रद्द करा", | |
| enterCodeFromImage: "पुढे जाण्यासाठी, कृपया खालील प्रतिमेतील कोड प्रविष्ट करा." | |
| }; | |
| globalThis.$altcha.i18n.set("mr", i18n$9); | |
| const i18n$8 = { | |
| ariaLinkLabel: "Altcha (அதிகாரப்பூர்வ வலைத்தளம்)", | |
| enterCode: "குறியீட்டை உள்ளிடவும்", | |
| enterCodeAria: "நீங்கள் கேட்கும் குறியீட்டை உள்ளிடவும். ஆடியோவை இயக்க Space ஐ அழுத்தவும்.", | |
| error: "சரிபார்ப்பு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.", | |
| expired: "சரிபார்ப்பு காலாவதியானது. மீண்டும் முயற்சிக்கவும்.", | |
| footer: 'மூலமாக பாதுகாக்கப்பட்டவை <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (அதிகாரப்பூர்வ வலைத்தளம்)">ALTCHA</a>', | |
| getAudioChallenge: "ஒலி சவாலை பெறவும்", | |
| label: "நான் ரோபோடான அல்ல", | |
| loading: "செயலாக்கம்...", | |
| reload: "மீண்டும் புதுப்பிக்கவும்", | |
| verify: "சரிபார்க்கவும்", | |
| verificationRequired: "சரிபார்ப்பு தேவை!", | |
| verified: "சரிபார்க்கப்பட்டது", | |
| verifying: "சரிபார்க்கப்படுகிறது...", | |
| waitAlert: "சரிபார்க்கப்படுகிறது... தயவுசெய்து காத்திருக்கவும்.", | |
| cancel: "ரத்துசெய்", | |
| enterCodeFromImage: "தொடர, கீழே உள்ள படத்திலிருந்து குறியீட்டை உள்ளிடவும்." | |
| }; | |
| globalThis.$altcha.i18n.set("ta", i18n$8); | |
| const i18n$7 = { | |
| ariaLinkLabel: "Altcha (అధికారిక వెబ్సైట్)", | |
| enterCode: "కోడ్ని నమోదు చేయండి", | |
| enterCodeAria: "మీరు విన్న కోడ్ని నమోదు చేయండి. ఆడియో ప్లే చేయడానికి స్పేస్ను నొక్కండి.", | |
| error: "చెకింగ్ విఫలమైంది. దయచేసి మరల ప్రయత్నించండి.", | |
| expired: "చెకింగ్ కాలం ముగిసింది. దయచేసి మరల ప్రయత్నించండి.", | |
| footer: 'ఈ సైట్ రక్షించబడింది <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (అధికారిక వెబ్సైట్)">ALTCHA</a>', | |
| getAudioChallenge: "ఆడియో ఛాలెంజ్ పొందండి", | |
| label: "నేను రోబోట్ కాదు", | |
| loading: "లోడ్ అవుతోంది...", | |
| reload: "మళ్ళీ లోడ్ చేయండి", | |
| verify: "ధ్రువీకరించు", | |
| verificationRequired: "ధృవీకరణ అవసరం!", | |
| verified: "ధ్రువీకరించబడింది", | |
| verifying: "ధ్రువీకరణ జరుగుతుంది...", | |
| waitAlert: "ధ్రువీకరణ జరుగుతుంది... దయచేసి వేచి ఉండండి.", | |
| cancel: "రద్దు చేయండి", | |
| enterCodeFromImage: "కొనసాగడానికి, దయచేసి క్రింది చిత్రంలో ఉన్న కోడ్ను నమోదు చేయండి." | |
| }; | |
| globalThis.$altcha.i18n.set("te", i18n$7); | |
| const i18n$6 = { | |
| ariaLinkLabel: "Altcha (เว็บไซต์ทางการ)", | |
| enterCode: "ป้อนรหัส", | |
| enterCodeAria: "ป้อนรหัสที่คุณได้ยิน กด Space เพื่อเล่นเสียง", | |
| error: "การตรวจสอบล้มเหลว กรุณาลองอีกครั้งภายหลัง", | |
| expired: "การตรวจสอบหมดอายุ กรุณาลองใหม่", | |
| footer: 'ป้องกันโดย <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (เว็บไซต์ทางการ)">ALTCHA</a>', | |
| getAudioChallenge: "รับการท้าทายเสียง", | |
| label: "ฉันไม่ใช่บอท", | |
| loading: "กำลังโหลด...", | |
| reload: "โหลดใหม่", | |
| verify: "ตรวจสอบ", | |
| verificationRequired: "จำเป็นต้องตรวจสอบ!", | |
| verified: "ตรวจสอบแล้ว", | |
| verifying: "กำลังตรวจสอบ...", | |
| waitAlert: "กำลังตรวจสอบ... กรุณารอ", | |
| cancel: "ยกเลิก", | |
| enterCodeFromImage: "เพื่อดำเนินการต่อ โปรดป้อนรหัสจากรูปภาพด้านล่าง" | |
| }; | |
| globalThis.$altcha.i18n.set("th", i18n$6); | |
| const i18n$5 = { | |
| ariaLinkLabel: "Altcha (سرکاری ویب سائٹ)", | |
| enterCode: "کوڈ درج کریں", | |
| enterCodeAria: "جو کوڈ آپ سنتے ہیں وہ درج کریں۔ آڈیو چلانے کے لیے اسپیس دبائیں۔", | |
| error: "توثیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", | |
| expired: "توثیق کی مدت ختم ہو گئی ہے۔ براہ کرم دوبارہ کوشش کریں۔", | |
| footer: 'کے ذریعے محفوظ <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (سرکاری ویب سائٹ)">ALTCHA</a>', | |
| getAudioChallenge: "آڈیو چیلنج حاصل کریں", | |
| label: "میں روبوٹ نہیں ہوں", | |
| loading: "لوڈ ہو رہا ہے...", | |
| reload: "دوبارہ لوڈ کریں", | |
| verify: "توثیق کریں", | |
| verificationRequired: "تصدیق ضروری ہے!", | |
| verified: "توثیق شدہ", | |
| verifying: "توثیق ہو رہی ہے...", | |
| waitAlert: "توثیق ہو رہی ہے... براہ کرم انتظار کریں۔", | |
| cancel: "منسوخ کریں", | |
| enterCodeFromImage: "اگلے مرحلے پر جانے کے لیے، براہ کرم نیچے دی گئی تصویر سے کوڈ درج کریں۔" | |
| }; | |
| globalThis.$altcha.i18n.set("ur", i18n$5); | |
| const i18n$4 = { | |
| ariaLinkLabel: "Altcha (rasmiy veb-sayt)", | |
| enterCode: "Kodni kiriting", | |
| enterCodeAria: "Eshitgan kodingizni kiriting. Audioni ijro etish uchun Bo'sh joy tugmasini bosing.", | |
| error: "Tekshiruv muvaffaqiyatsiz tugadi. Keyinroq qayta urinib ko'ring.", | |
| expired: "Tekshiruv muddati tugadi. Qayta urinib ko'ring.", | |
| footer: '<a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (rasmiy veb-sayt)">ALTCHA</a> tomonidan himoyalangan', | |
| getAudioChallenge: "Audio sinovni olish", | |
| label: "Men robot emasman", | |
| loading: "Yuklanmoqda...", | |
| reload: "Qayta yuklash", | |
| verify: "Tekshirish", | |
| verificationRequired: "Tekshiruv talab qilinadi!", | |
| verified: "Tekshirildi", | |
| verifying: "Tekshirilmoqda...", | |
| waitAlert: "Tekshirilmoqda... iltimos kuting.", | |
| cancel: "Bekor qilish", | |
| enterCodeFromImage: "Davom etish uchun, iltimos, quyidagi rasmda ko'rsatilgan kodni kiriting." | |
| }; | |
| globalThis.$altcha.i18n.set("uz", i18n$4); | |
| const i18n$3 = { | |
| ariaLinkLabel: "Altcha (trang web chính thức)", | |
| enterCode: "Nhập mã", | |
| enterCodeAria: "Nhập mã bạn nghe được. Nhấn Phím cách để phát âm thanh.", | |
| error: "Xác minh thất bại. Vui lòng thử lại sau.", | |
| expired: "Xác minh đã hết hạn. Vui lòng thử lại.", | |
| footer: 'Được bảo vệ bởi <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (trang web chính thức)">ALTCHA</a>', | |
| getAudioChallenge: "Nhận thử thách âm thanh", | |
| label: "Tôi không phải là robot", | |
| loading: "Đang tải...", | |
| reload: "Tải lại", | |
| verify: "Xác minh", | |
| verificationRequired: "Yêu cầu xác minh!", | |
| verified: "Đã xác minh", | |
| verifying: "Đang xác minh...", | |
| waitAlert: "Đang xác minh... vui lòng chờ.", | |
| cancel: "Hủy bỏ", | |
| enterCodeFromImage: "Để tiếp tục, vui lòng nhập mã từ hình ảnh bên dưới." | |
| }; | |
| globalThis.$altcha.i18n.set("vi", i18n$3); | |
| const i18n$2 = { | |
| ariaLinkLabel: "Altcha (官方网站)", | |
| enterCode: "输入代码", | |
| enterCodeAria: "输入您听到的代码。按空格键播放音频。", | |
| error: "验证失败。稍后再试。", | |
| expired: "验证已过期。请重试。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方网站)">ALTCHA</a> 保护', | |
| getAudioChallenge: "获取音频挑战", | |
| label: "我不是机器人", | |
| loading: "加载中...", | |
| reload: "重新加载", | |
| verify: "验证", | |
| verificationRequired: "需要验证!", | |
| verified: "已验证", | |
| verifying: "正在验证...", | |
| waitAlert: "正在验证... 请稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "为继续操作,请输入下图中显示的验证码。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-cn", i18n$2); | |
| const i18n$1 = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| cancel: "取消", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入你聽到嘅代碼。按空格鍵播放音訊。", | |
| enterCodeFromImage: "要繼續,請輸入下面圖片入面嘅代碼。", | |
| error: "驗證失敗。請稍後再試。", | |
| expired: "驗證已過期。請再試一次。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 提供保護', | |
| getAudioChallenge: "取得音訊驗證", | |
| label: "我唔係機械人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "驗證中...", | |
| waitAlert: "驗證中... 請稍候。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-hk", i18n$1); | |
| const i18n = { | |
| ariaLinkLabel: "Altcha (官方網站)", | |
| enterCode: "輸入代碼", | |
| enterCodeAria: "輸入您聽到的代碼。按空格鍵播放音頻。", | |
| error: "驗證失敗。稍後再試。", | |
| expired: "驗證已過期。請重試。", | |
| footer: '由 <a href="https://altcha.org/" tabindex="-1" target="_blank" aria-label="Altcha (官方網站)">ALTCHA</a> 保護', | |
| getAudioChallenge: "獲取音頻挑戰", | |
| label: "我不是機器人", | |
| loading: "載入中...", | |
| reload: "重新載入", | |
| verify: "驗證", | |
| verificationRequired: "需要驗證!", | |
| verified: "已驗證", | |
| verifying: "正在驗證...", | |
| waitAlert: "正在驗證... 請稍等。", | |
| cancel: "取消", | |
| enterCodeFromImage: "若要繼續,請輸入下方的圖片驗證碼。" | |
| }; | |
| globalThis.$altcha.i18n.set("zh-tw", i18n); | |
변경 전gd_board_view.js
| */ | |
| $(document).ready(function () { | |
| $('img.js-smart-img').each(function(){ | |
| $(this).css('max-width','100%'); | |
| }); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| */ | |
| $(document).ready(function () { | |
| $('img.js-smart-img').each(function(){ | |
| $(this).css('max-width','100%'); | |
| }); | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 후gd_board_view.js
| */ | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| $('img.js-smart-img').each(function(){ | |
| $(this).css('max-width','100%'); | |
| }); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| */ | |
| $(document).ready(function () { | |
| /** | |
| * ALTCHA(자동등록방지) 게이트 — 위젯이 있으면 verified 상태여야 제출 허용 | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaGuard = function (formEl) { | |
| const widget = formEl.find('altcha-widget')[0]; | |
| if (widget && typeof widget.getState === 'function' && widget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * ALTCHA 위젯이 발급한 payload(hidden input) 값을 읽는다. AJAX 제출용. | |
| * @param {jQuery} formEl 캡차 위젯을 포함하는 폼 컨테이너 | |
| */ | |
| const altchaPayload = function (formEl) { | |
| return formEl.find('input[name=altcha]').val(); | |
| }; | |
| $('img.js-smart-img').each(function(){ | |
| $(this).css('max-width','100%'); | |
| }); | |
| return false; | |
| } | |
| if (!altchaGuard(domRoot.commentFormWrite.element)) { | |
| return false; | |
| } | |
| if (domRoot.commentFormWrite.isSecret.is(':checked') || domRoot.commentFormWrite.isSecret.val() === 'y' ) { | |
| isSecret = 'y'; | |
| } | |
| writerPw: domRoot.commentFormWrite.password.val(), | |
| isSecret: isSecret, | |
| captchaKey: domRoot.commentFormWrite.captchaKey.val(), | |
| altcha: altchaPayload(domRoot.commentFormWrite.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
| return false; | |
| } | |
| if (!altchaGuard(commentFormAction.element)) { | |
| return false; | |
| } | |
| if (commentFormAction.isSecret.is(':checked') || commentFormAction.isSecret.val() === 'y') { | |
| isSecret = 'y'; | |
| } | |
| memo: commentFormAction.memo.val(), | |
| isSecret: isSecret, | |
| captchaKey: commentFormAction.captchaKey.val(), | |
| altcha: altchaPayload(commentFormAction.element), | |
| }, | |
| dataType: 'json' | |
| }).success(function (data) { | |
변경 전gd_board_write.js
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function addUpload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js-board-layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popup-select-goods').empty().append(data); | |
| $('#popup-select-goods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js-layer-close',function(e){ | |
| e.stopPropagation(); | |
| $('.js-select-confirm').off('click'); | |
| $('#popup-select-goods').empty(); | |
| $('#popup-select-goods').hide(); | |
| }) | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.itemselect-comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("select[id=category]").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("textarea[name=contents]").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function initFileUpload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = getPrevImg(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#board-attach li.item.template").clone(); | |
| $("#board-attach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file-face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#board-attach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#board-attach li.item.template').off().on("click", 'button.file-face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file-face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file-hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#board-attach li.item:not(.template) input.file-hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| $fileHidden.val(''); | |
| fileHidden.onchange = function () { | |
| var index = $("#board-attach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = getPrevImg(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#board-attach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function getPrevImg(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function addUpload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js-board-layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popup-select-goods').empty().append(data); | |
| $('#popup-select-goods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js-layer-close',function(e){ | |
| e.stopPropagation(); | |
| $('.js-select-confirm').off('click'); | |
| $('#popup-select-goods').empty(); | |
| $('#popup-select-goods').hide(); | |
| }) | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.itemselect-comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| captchaKey: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| captchaKey: { | |
| required: __('자동등록방지 문자를 입력해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("select[id=category]").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("textarea[name=contents]").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function initFileUpload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = getPrevImg(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#board-attach li.item.template").clone(); | |
| $("#board-attach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file-face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#board-attach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#board-attach li.item.template').off().on("click", 'button.file-face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file-face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file-hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#board-attach li.item:not(.template) input.file-hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| $fileHidden.val(''); | |
| fileHidden.onchange = function () { | |
| var index = $("#board-attach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = getPrevImg(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#board-attach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function getPrevImg(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
변경 후gd_board_write.js
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function addUpload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js-board-layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popup-select-goods').empty().append(data); | |
| $('#popup-select-goods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js-layer-close',function(e){ | |
| e.stopPropagation(); | |
| $('.js-select-confirm').off('click'); | |
| $('#popup-select-goods').empty(); | |
| $('#popup-select-goods').hide(); | |
| }) | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.itemselect-comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("select[id=category]").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("textarea[name=contents]").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function initFileUpload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = getPrevImg(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#board-attach li.item.template").clone(); | |
| $("#board-attach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file-face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#board-attach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#board-attach li.item.template').off().on("click", 'button.file-face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file-face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file-hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#board-attach li.item:not(.template) input.file-hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| $fileHidden.val(''); | |
| fileHidden.onchange = function () { | |
| var index = $("#board-attach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = getPrevImg(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#board-attach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function getPrevImg(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
| function captchaReload() { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../board/captcha.php?ch=' + someDate); | |
| }, 1); | |
| } | |
| /* | |
| function addUpload() { | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| if (uploadBoxCount > 4) { | |
| alert("업로드는 최대 5개만 지원합니다"); | |
| return; | |
| } | |
| var addUploadBox = _.template( | |
| $("script.template").html() | |
| ); | |
| $('#uploadBox:last').append(addUploadBox({idx: uploadBoxCount + 1})); | |
| } | |
| function uploadRemove(obj) { | |
| obj.closest('.file-upload').remove(); | |
| } | |
| */ | |
| var boardSubmitFl = true; | |
| $(document).ready(function () { | |
| var params = {}; | |
| if(typeof bdId != 'undefined') { | |
| params = { | |
| bdId : bdId, | |
| bdSno : bdSno, | |
| }; | |
| } | |
| $('.js-board-layer').bind('click',function(){ | |
| var type = $(this).data('type'); | |
| $.ajax({ | |
| method: "POST", | |
| data : params, | |
| cache: false, | |
| url: "../share/layer_"+type+"_select.php", | |
| success: function (data) { | |
| $('#popup-select-goods').empty().append(data); | |
| $('#popup-select-goods').show(); | |
| }, | |
| error: function (data) { | |
| alert(data.message); | |
| } | |
| }); | |
| }) | |
| $('body').on('click','.js-layer-close',function(e){ | |
| e.stopPropagation(); | |
| $('.js-select-confirm').off('click'); | |
| $('#popup-select-goods').empty(); | |
| $('#popup-select-goods').hide(); | |
| }) | |
| $('body').on('click','.js-select-remove',function(){ | |
| $(this).closest('div.js-select-item').remove(); | |
| $('.itemselect-comment').show(); | |
| }) | |
| uploadBoxCount = $('#uploadBox').find('.file-upload').length; | |
| $('.file-upload:last').find('label').attr('for', 'attach' + uploadBoxCount); | |
| $('.file-upload:last').find('input[type=file]').attr('id', 'attach' + uploadBoxCount); | |
| if (cfgUploadFl == 'y') { | |
| $('#addUploadBtn').bind('click', function () { | |
| addUpload(); | |
| }); | |
| } | |
| $("#frmWrite").validate({ | |
| ignore: 'altcha-widget *', | |
| submitHandler: function (form) { | |
| if (boardSubmitFl === false) { | |
| alert(__('처리중입니다. 잠시만 기다려주세요.')); | |
| return false; | |
| } | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return false; | |
| } | |
| if($(form).find('[name=uploadType]').val() == 'ajax') { | |
| $('input:file').prop('disabled', true); | |
| } | |
| if (cfgEditorFl == 'y') { | |
| oEditors.getById["editor"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다. | |
| } | |
| boardSubmitFl = false; | |
| form.submit(); | |
| $('iframe[name=ifrmProcess]').load(function(){ | |
| var doc = this.contentWindow ? this.contentWindow.document : (this.contentDocument ? this.contentDocument : this.document); | |
| var root = doc.documentElement ? doc.documentElement : doc.body; | |
| var result = root.textContent ? root.textContent : root.innerText; | |
| result = result.replace(/(\s+)|(\s+$)|(\r)|(\n)/g, ""); | |
| if (result.indexOf(__('저장되었습니다')) < 0 && result.indexOf('/board/list.php') < 0) { //실패 시 버튼 활성화 | |
| boardSubmitFl = true; | |
| } | |
| }); | |
| }, | |
| rules: { | |
| private: 'required', | |
| contents: { | |
| required: function (textarea) { | |
| if (cfgEditorFl == 'y') { | |
| var editorcontent = oEditors.getById[textarea.id].getIR(); // 에디터의 내용 가져오기. | |
| editorcontent = editorcontent.replace(/<(?!img).*?>/ig, '').replace(' ', ''); //이미지테그제외한 테그제거 | |
| return editorcontent.length === 0; | |
| } | |
| else { | |
| return textarea.value.length === 0; | |
| } | |
| } | |
| }, | |
| writerNm: 'required', | |
| writerPw: 'required', | |
| subject: 'required', | |
| goodsPt: 'required', | |
| writerEmail: { | |
| required: true, | |
| email: true | |
| }, | |
| }, | |
| messages: { | |
| writerNm: { | |
| required: __('작성자를 입력해주세요.') | |
| }, | |
| writerPw: { | |
| required: __('비밀번호를 입력해주세요.') | |
| }, | |
| subject: { | |
| required: __('제목을 입력해주세요.') | |
| }, | |
| contents: { | |
| required: __('내용을 입력해주세요') | |
| }, | |
| private: { | |
| required: __('이용약관과 개인정보 수집 및 이용에 대한 안내 모두 동의해주세요.') | |
| }, | |
| goodsPt: { | |
| required: __('평가를 체크해주세요.') | |
| }, | |
| writerEmail: { | |
| required: __('이메일을 입력해주세요.'), | |
| email: __('메일 형식이 틀렸습니다.') | |
| } | |
| } | |
| }) | |
| $("select[id=category]").on("change", function(){ | |
| var category = $(this).val(); | |
| var bdId = $('[name="bdId"]').val(); | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'category', bdId: bdId, 'category': category}, | |
| dataType: 'text', | |
| cache: false, | |
| async: false, | |
| }).success(function (result) { | |
| $("textarea[name=contents]").val(result).focus(); | |
| }).error(function (e) { | |
| alert(e.responseText); | |
| }); | |
| }); | |
| }); | |
| function initFileUpload() { | |
| var maxUploadFile = maxFileNumber; | |
| maxUploadFile = maxUploadFile ? maxUploadFile : 0; | |
| if (mode == 'modify') { | |
| for (var i = 0; i < prvFilePath.length; i++) { | |
| prevImg = getPrevImg(prvFileName[i], prvFilePath[i]); | |
| $newItem = $("#board-attach li.item.template").clone(); | |
| $("#board-attach li.item.template").before($newItem); | |
| $newItem.removeClass("template"); | |
| $prvFileFace = $newItem.find('.file-face'); | |
| prewFileFace = $prvFileFace[0]; | |
| $prvFileFace.addClass("preview").css({ | |
| "background-image": "url('" + prevImg + "')" | |
| }); | |
| } | |
| $("#board-attach li.item:not(.template)").each(function (index) { | |
| this.onclick = function () { | |
| var delFilehtml = ''; | |
| if (confirm(__('첨부된 파일을 삭제하시겠습니까?'))) { | |
| delFilehtml = '<input type="hidden" name="delFile[' + index + ']" value="y" />'; | |
| $('#frmWrite').append(delFilehtml); | |
| this.remove(); | |
| } | |
| }; | |
| }); | |
| } | |
| $('#board-attach li.item.template').off().on("click", 'button.file-face', function () { | |
| var templateContainer = this.parentNode; | |
| // templateContainer.remove('input'); | |
| var $container = $(templateContainer); | |
| var $fileFace = $container.find("button.file-face"), fileFace = $fileFace[0]; | |
| var $fileHidden = $container.find("input.file-hidden"), fileHidden = $fileHidden[0]; | |
| var idx = $('input[name="' + fileHidden.name + '"]').index(this); | |
| if ($("#board-attach li.item:not(.template) input.file-hidden").length >= maxUploadFile) { | |
| alert(__('첨부파일은 최대 %1$s개 까지 업로드 가능합니다.', maxUploadFile.toString())); | |
| return false; | |
| } | |
| else { | |
| $fileHidden.val(''); | |
| fileHidden.onchange = function () { | |
| var index = $("#board-attach").find('li').index($(this).closest("li")); | |
| //ajax업로드 처리 | |
| var uploadImages = []; | |
| gdAjaxUpload.upload( | |
| { | |
| formObj: $("#frmWrite"), | |
| thisObj: $(this), | |
| actionUrl: '../board/board_ps.php', | |
| params: {bdId: $('[name=bdId]').val(), 'mode': 'ajaxUpload'}, | |
| onbeforeunload: function () { | |
| if (uploadImages.length == 0) { | |
| return false; | |
| } | |
| $.ajax({ | |
| method: "POST", | |
| url: "../board/board_ps.php", | |
| data: {mode: 'deleteGarbageImage', bdId: $('[name=bdId]').val(), deleteImage: uploadImages.join('^|^')}, | |
| cache: false, | |
| }).success(function (data) { | |
| }).error(function (e) { | |
| }); | |
| }, | |
| successAfter: function (data) { | |
| uploadImages.push(data.saveFileNm); | |
| }, | |
| failAfter : function(data) { | |
| if (data.result == 'fail' && fileHidden.name == 'upfiles[]') { | |
| $('input[name="' + fileHidden.name + '"]').eq(idx).val(''); | |
| } | |
| } | |
| } | |
| ) | |
| if(gdAjaxUpload.isSuccess == false){ | |
| return false; | |
| } | |
| var fileReader = new FileReader(); | |
| fileName = this.files[0].name; | |
| fileReader.readAsDataURL(this.files[0]); | |
| fileReader.onload = function () { | |
| previewUrl = getPrevImg(fileName, this.result); | |
| $(templateContainer).clone(true).appendTo($("#board-attach")); | |
| $container.removeClass("template"); | |
| $fileFace.addClass("preview").css({ | |
| "background-image": "url('" + previewUrl + "')", | |
| "background-position": "center", | |
| "background-size": "cover", | |
| "background-repeat": "no-repeat", | |
| "-webkit-background-size": "cover", | |
| "-moz-background-size": "cover", | |
| "-o-background-size": "cover" | |
| }); | |
| fileFace.onclick = function (e) { | |
| if (confirm(__("첨부된 파일을 삭제하시겠습니까?"))) { | |
| $("input[name='uploadFileNm[" + index + "]']").remove(); | |
| $("input[name='saveFileNm[" + index + "]']").remove(); | |
| $container.remove(); | |
| } else { | |
| e.stopPropagation(); | |
| } | |
| }; | |
| }; | |
| fileReader.onerror = function () { | |
| alert(__("이미지 로드 중 에러가 발생했습니다.")); | |
| }; | |
| }; | |
| $fileHidden.trigger("click"); | |
| } | |
| }); | |
| } | |
| function getPrevImg(fileName, imgUrl) { | |
| var fileExt = ''; | |
| if (fileName.indexOf('.') > 0) { | |
| _fileExt = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(); | |
| fileExt = _fileExt.replace('.', ''); | |
| } | |
| switch (fileExt) { | |
| case 'gif': | |
| case 'jpg': | |
| case 'bmp': | |
| case 'png': | |
| case 'jpeg': | |
| return imgUrl; | |
| break; | |
| case 'doc': | |
| case'docx': | |
| fileName = 'icon_file_doc.png'; | |
| break; | |
| case 'ppt': | |
| case'pptx': | |
| fileName = 'icon_file_ppt.png'; | |
| break; | |
| case 'pdf': | |
| fileName = 'icon_file_pdf.png'; | |
| break; | |
| case 'xls': | |
| case'xlsx': | |
| fileName = 'icon_file_xls.png'; | |
| break; | |
| case 'txt': | |
| fileName = 'icon_file_txt.png'; | |
| break; | |
| default : | |
| fileName = 'icon_file_etc.png'; | |
| } | |
| previewUrl = mobileSkinPath + '/img/new/' + fileName; | |
| return previewUrl; | |
| } | |
| function setAddGoods(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectGoodsTblTr').html()); | |
| var param = {goodsNo: val.goodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, goodsPrice: val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectGoodsBox").empty(); | |
| $("#selectGoodsBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
| function setAddOrder(frmData) { | |
| $.each(frmData.info, function (key, val) { | |
| var selectTblTr = _.template($('#selectOrderTblTr').html()); | |
| var param = {orderNo: val.orderNo, orderGoodsNo: val.orderGoodsNo, goodsImgageSrc: val.goodsImgageSrc, goodsName: val.goodsName, optionName:val.optionName,goodsPrice:val.goodsPrice}; | |
| selecttblTrHtml = selectTblTr(param); | |
| }); | |
| $("#selectOrderBox").empty(); | |
| $("#selectOrderBox").append(selecttblTrHtml); | |
| $('.itemselect-comment').hide(); | |
| } | |
변경 전gd_common.js
| return formatted; | |
| }; | |
| function resize_frame(obj) { | |
| var iframeHeight = | |
| (obj).contentWindow.document.body.clientHeight; | |
변경 후gd_common.js
| return formatted; | |
| }; | |
| /* iframe(mypage 등)으로 board 목록이 실릴 때, onload 1회 측정(resize_frame/gd_resize_frame) 이후에도 | |
| 댓글/답글 폼 토글, ALTCHA 위젯 지연 렌더, 댓글 등록/삭제 등으로 내용 높이가 바뀌면 | |
| 부모 iframe 높이를 다시 맞춘다. body 높이가 실제로 변했을 때만 호출해 재측정 루프를 방지. */ | |
| (function () { | |
| let parentResize; | |
| try { | |
| if (window.parent === window) { | |
| return; // 최상위 문서 → 대상 아님 | |
| } | |
| parentResize = window.parent.gd_resize_frame || window.parent.resize_frame; | |
| } catch (e) { | |
| return; // cross-origin 부모 → 접근 불가, 대상 아님 | |
| } | |
| if (typeof parentResize !== 'function' || typeof window.ResizeObserver === 'undefined') { | |
| return; | |
| } | |
| const startObserve = function () { | |
| const frameEl = window.frameElement | |
| || (window.name ? window.parent.document.getElementsByName(window.name)[0] : null); | |
| if (!frameEl || !document.body) { | |
| return; | |
| } | |
| let timer = null; | |
| let lastHeight = -1; | |
| const observer = new ResizeObserver(function () { | |
| if (timer) { | |
| clearTimeout(timer); | |
| } | |
| timer = setTimeout(function () { | |
| const height = document.body.clientHeight; | |
| if (height === lastHeight) { | |
| return; // 실제 콘텐츠 높이 변화 없음 → 재측정 루프 방지 | |
| } | |
| lastHeight = height; | |
| parentResize.call(window.parent, frameEl); | |
| }, 100); | |
| }); | |
| observer.observe(document.body); | |
| }; | |
| if (document.body) { | |
| startObserve(); | |
| } else { | |
| document.addEventListener('DOMContentLoaded', startObserve); | |
| } | |
| })(); | |
| function resize_frame(obj) { | |
| var iframeHeight = | |
| (obj).contentWindow.document.body.clientHeight; | |
변경 전gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: function () { | |
| return alert(__('자동등록방지 문자를 입력해주세요.')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| $(form).find('select').prop('disabled', false); | |
| $('.btn-join').attr("disabled", true); | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| }, | |
| captchaKey: { | |
| required: true | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| }, | |
| captchaKey: { | |
| required: function () { | |
| return alert(__('자동등록방지 문자를 입력해주세요.')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| $(form).find('select').prop('disabled', false); | |
| $('.btn-join').attr("disabled", true); | |
변경 후gd_member2.js
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $(form).find('select').prop('disabled', false); | |
| $('.btn-join').attr("disabled", true); | |
| is_my_page = false; | |
| validate_settings = { | |
| defaults: { | |
| ignore: ".ignore, altcha-widget *", | |
| focusCleanup: true, | |
| rules: { | |
| memPwRe: { | |
| rangelength: function () { | |
| return [$('input[name="busiNo"]').data('charlen'), $('input[name="busiNo"]').data('charlen')]; | |
| } | |
| } | |
| }, | |
| messages: { | |
| rangelength: function () { | |
| return __("사업자번호는 %i자로 입력해야 합니다.", $('input[name="busiNo"]').data('charlen')); | |
| } | |
| } | |
| }, | |
| errorElement: 'div', | |
| validate.settings.submitHandler = func; | |
| } | |
| if (validate.form()) { | |
| const altchaWidget = document.querySelector('altcha-widget'); | |
| if (altchaWidget && typeof altchaWidget.getState === 'function' && altchaWidget.getState() !== 'verified') { | |
| alert(__('자동등록방지 확인을 완료해주세요.')); | |
| return; | |
| } | |
| $(form).find('select').prop('disabled', false); | |
| $('.btn-join').attr("disabled", true); | |
변경 전join.html
| </div> | |
| </form> | |
| </section> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
| </div> | |
| </form> | |
| </section> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| <!--{? joinField.captcha.use == 'y'}--> | |
| $('#reload_captcha').click(function (e) { | |
| $('#captchaImg').removeAttr('src'); | |
| setTimeout(function () { | |
| var someDate = new Date(); | |
| someDate = someDate.getTime(); | |
| $('#captchaImg').attr('src', '../member/captcha.php?ch=' + someDate); | |
| }, 1); | |
| }).trigger('click'); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
변경 후join.html
| </div> | |
| </form> | |
| </section> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
| </div> | |
| </form> | |
| </section> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"></script> | |
| <script type="module" src="\{=c.PATH_MOBILE_SKIN}js/altcha/i18n.js"></script> | |
| <script type="text/javascript"> | |
| var paycoProfile = {paycoProfile}; | |
| var naverProfile = {naverProfile}; | |
| }); | |
| <!--{/}--> | |
| select_email_domain('email'); | |
| gd_member2.init($formJoin); | |
변경 전_join_view_captcha.html
| <div class="account_content"> | |
| <div class="table1 gd_member_option_table"> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" id="reload_captcha" class="normal-btn small1 captchareload"> | |
| <em><img src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="account_content"> | |
| <div class="table1 gd_member_option_table"> | |
| <div class="input_wrap ty3"> | |
| <div class="capcha"> | |
| <div class="capcha-img"> | |
| <img src="./captcha.php" align="absmiddle" id="captchaImg"/> | |
| </div> | |
| <div class="capcha-body"> | |
| <div class="capcha-text"> | |
| <p class="pre">{=__('보이는 순서대로 %s숫자 및 문자를 모두 입력해 주세요.', '<br />')}</p> | |
| </div> | |
| <div class="txt-field hs"> | |
| <input type="text" name="captchaKey" maxlength="5" onKeyUp="this.value=this.value.toUpperCase();" onfocus="this.select()" placeholder="{=__('문자를 입력해주세요.')}" class="text captcha"> | |
| </div> | |
| <button type="button" id="reload_captcha" class="normal-btn small1 captchareload"> | |
| <em><img src="../img/etc/icon-reset.png" alt="" class="va-m"> {=__('이미지 새로고침')}</em> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
변경 후_join_view_captcha.html
| <div class="account_content"> | |
| <div class="table1 gd_member_option_table"> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </div> | |
| </div> | |
| <div class="account_content"> | |
| <div class="table1 gd_member_option_table"> | |
| <div class="input_wrap ty3"> | |
| {=includeWidget('share/_altcha.html', 'altchaChallenge', './captcha.php')} | |
| </div> | |
| </div> | |
| </div> | |
변경 전_altcha.html
변경 후_altcha.html
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Mobile\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |
| {*** [공통 위젯] 자동등록방지 ALTCHA | share/_altcha.html (Widget\Mobile\Share\AltchaWidget) ***} | |
| {*** altchaChallenge : (필수) challenge 발급 스크립트 경로. 폼 위치에 따라 상대/절대 경로가 다르므로 호출부에서 지정 (mode 쿼리스트링은 위젯이 서버 사이드에서 부착) ***} | |
| {*** altchaSrc : (옵션) 'y' 이면 data-altcha-src 부여 → AJAX 인라인 주입 폼에서 altcha.js 동적 로드 ***} | |
| {*** altchaConfig : (옵션) altcha-widget configuration JSON 을 덮어씀. 미지정 시 {"hideLogo":true,"hideFooter":true} ***} | |
| <div class="capcha capcha_altcha"<!--{? altchaSrc == 'y'}--> data-altcha-src="\{=c.PATH_MOBILE_SKIN}js/altcha/altcha.js"<!--{/}-->> | |
| <altcha-widget | |
| challenge="{=altchaChallenge}?mode={=altchaMode}" | |
| name="altcha" | |
| auto="off" | |
| language="{=gGlobal.locale}" | |
| configuration='<!--{? altchaConfig}-->{=altchaConfig}<!--{:}-->{"hideLogo":true,"hideFooter":true}<!--{/}-->' | |
| type="native" | |
| ></altcha-widget> | |
| </div> | |