 layout_output["preds"]["combined"]})

        # print(flow_output.keys())
        # print(layout_output.keys())

        # output = {"ACTION": (video_output["ACTION"] + flow_output["ACTION"] + layout_output["ACTION"])/3}
        if return_features:
            return {
                "preds": pred,
                "features": {"video": video_features, "layout": layout_features},
            }
        return {"preds": pred}

class Flow_Model(nn.Module):
    def __init__(self, cfg: CfgNode):
        super(Flow_Model, self).__init__()
        self.cfg = copy.deepcopy(cfg)

        cfg_flow = copy.deepcopy(cfg)
        cfg_flow.defrost()
        # cfg_flow.BACKBONE_MODEL_PATH = None
        cfg_flow.CHECKPOINT_PATH = cfg.FLOW_PRETRAINED_PATH if "FLOW_PRETRAINED_PATH" in cfg else None
        cfg_flow.freeze()
        self.flow_model = SwinModel(cfg=cfg_flow)

    def forward(self, batch: Dict[str, torch.Tensor], return_features: bool = False):

        flow_output, flow_features = self.flow_model(batch, return_features=True)

        pred = {"combined": flow_output["ACTION"]["combined"]}

        if return_features:
            return {"ACTION": pred, "features": {"flow": flow_features}}
        return {"ACTION": pred}

class Video_Layout_Model_Ens(nn.Module):
    def __init__(self, cfg: CfgNode):
        super(Video_Layout_Model_Ens, self).__init__()
        self.cfg = copy.deepcopy(cfg)

        # self.cfg.TRAIN_DATASET_PATH = "project_default_directory/Sth-Sth/something_something_detections/kkontras_flow_train.json"
        # self.cfg.VAL_DATASET_PATH = "project_default_directory/Sth-Sth/something_something_detections/kkontras_flow_val.json"
        cfg_video = copy.deepcopy(cfg)
        cfg_video.defrost()
        cfg_video.CHECKPOINT_PATH = cfg.VIDEO_PRETRAINED_PATH if "VIDEO_PRETRAINED_PATH" in cfg else None
        cfg_video.freeze()
        self.video_model = SwinModel(cfg=cfg_video)

        cfg_layout = copy.deepcopy(cfg)
        cfg_layout.defrost()
        cfg_layout.BACKBONE_MODEL_PATH = None
        cfg_layout.CHECKPOINT_PATH = cfg.LAYOUT_PRETRAINED_PATH if "LAYOUT_PRETRAINED_PATH" in cfg else None
        cfg_layout.freeze()
        self.layout_model = Stlt(cfg=cfg_layout)

        # if cfg.CHECKPOINT_PATH:
        #     print("We are loading from {}".format(cfg.CHECKPOINT_PATH))
        #     self.load_state_dict(torch.load(cfg.CHECKPOINT_PATH, map_location="cpu"))

    def forward(self, batch: Dict[str, torch.Tensor], return_features: bool = False):

        video_output, video_features = self.video_model(batch, return_features=True)

        layout_output, layout_features = self.layout_model(batch, return_features=True)

        pred = {"combined": (video_output["ACTION"]["combined"] + layout_output["ACTION"]["combined"]) / 2}
        pred.update({"video": video_output["ACTION"]["combined"]})
        pred.update({"layout": layout_output["ACTION"]["combined"]})

        if return_features:
            return {
                "ACTION": pred,
                "features": {"video": video_features, "layout": layout_features},
            }
        return {"ACTION": pred}

model_factory = {
    "stlt": Stlt,
    "swin": SwinModel,
}


order = 0,
		group = 0,
		num = 1,
		discount = 0,
		resource_type = 14,
		id = 60109,
		genre = "gift_package",
		discount_time = {},
		limit_args = {
			{
				"time",
				5
			}
		},
		effect_args = {
			40102
		},
		time = {
			{
				{
					2018,
					4,
					28
				},
				{
					0,
					0,
					0
				}
			},
			{
				{
					2018,
					6,
					4
				},
				{
					23,
					59,
					59
				}
			}
		}
	},
	[60110] = {
		group_type = 0,
		resource_num = 980,
		desc = "980钻石购买红染建造补给",
		type = 2,
		is_auto_use = 1,
		group_limit = 0,
		group_buy_count = 0,
		tag = 1,
		time_second = 0,
		order = 0,
		group = 0,
		num = 1,
		discount = 0,
		resource_type = 14,
		id = 60110,
		genre = "gift_package",
		discount_time = {},
		limit_args = {
			{
				"time",
				1
			}
		},
		effect_args = {
			40004
		},
		time = {
			{
				{
					2018,
					4,
					28
				},
				{
					0,
					0,
					0
				}
			},
			{
				{
					2018,
					6,
					4
				},
				{
					23,
					59,
					59
				}
			}
		}
	},
	[60111] = {
		group_type = 0,
		resource_num = 500,
		desc = "500钻石购买家具币礼包",
		type = 2,
		is_auto_use = 1,
		group_limit = 0,
		group_buy_count = 0,
		tag = 1,
		time_second = 0,
		order = 0,
		group = 0,
		num = 1,
		discount = 0,
		resource_type = 14,
		id = 60111,
		genre = "gift_package",
		discount_time = {},
		limit_args = {
			{
				"time",
				1
			}
		},
		effect_args = {
			40103
		},
		time = {
			{
				{
					2018,
					4,
					28
				},
				{
					0,
					0,
					0
				}
			},
			{
				{
					2018,
					6,
					4
				},
				{
					23,
					59,
					59
				}
			}
		}
	},
	[60115] = {
		group_type = 0,
		resource_num = 980,
		desc = "980 다이아로 한정 건조 패키지를 구입",
		type = 2,
		is_auto_use = 1,
		group_limit = 0,
		group_buy_count = 0,
		tag = 1,
		time_second = 0,
		order = 0,
		group = 0,
		num = 1,
		discount = 0,
		resource_type = 14,
		id = 60115,
		genre = "gift_package",
		discount_time = {},
		limit_args = {
			{
				"time",
				2
			}
		},
		effect_args = {
			40104
		},
		time = {
			{
				{
					2018,


sult
}
import AbstractVinyl from './abstract-vinyl';

export default class Dist extends AbstractVinyl {
  static loadFromParsedString(parsedString: Record<string, any>): Dist | null {
    if (!parsedString) return null;
    const opts = super.loadFromParsedStringBase(parsedString);
    return new Dist(opts);
  }

  static loadFromParsedStringArray(arr: Record<string, any>[]): Dist[] | null | undefined {
    if (!arr) return null;
    // @ts-ignore
    return arr.map(this.loadFromParsedString);
  }

  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  clone(opts?: { contents?: boolean; deep?: boolean } | boolean): this {
    // @ts-ignore
    return new Dist(this);
  }
}
import { FileInfo } from "../Models/FileInfo";
import { GSResponse } from "../Models/GSResponse";
import { SysLog } from "./SysLog";

export class Utils {

    static ex;
    static sortCol2 = 9;
    static sortDescending2 = false;
    static getCreateFolder(folderName) {
        var folders = DriveApp.getFoldersByName(folderName);
        var folder = null;
        if (folders.hasNext())
            folder = folders.next();
        else
            folder = DriveApp.createFolder(folderName);
        return folder;
    }

    static getFolder(folderUrl:string)
    {
        let folder = null;
        if ( folderUrl.toLowerCase().startsWith("http"))
        {
            let index = folderUrl.lastIndexOf("/");
            if ( index > 0 )
            {
                let folderId = folderUrl.substr(index+1);
                folder = DriveApp.getFolderById(folderId);
            }

        }
        else
            folder = this.getCreateFolder(folderUrl);
        return folder;
    }

    static ValidateEmail(mail) {
        if (/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(mail))
            return true;
        return false;
    }

    static getTimeStamp(dt: Date = null) {
        if (dt == null)
            dt = new Date();
        return Utilities.formatDate(dt, Session.getScriptTimeZone(), 'yyyy-MM-dd HH-mm-ss');
    }

    static getDateYMD(dt=null)
    {
        if ( dt == null )
            dt = new Date();

            return Utilities.formatDate(dt, Session.getScriptTimeZone(), 'yyyy-MM-dd');
    }

    //https://stackoverflow.com/questions/1353684/detecting-an-invalid-date-date-instance-in-javascript

    static isDate(dt)
    {
        let result =true;
        if (Object.prototype.toString.call(dt) === "[object Date]") {
            // it is a date
            if (isNaN(dt.getTime())) {  // d.valueOf() could also work
              // date is not valid
              result = false;
            } else {
              // date is valid
              result = true;
            }
          } else {
            result =false;
          }
        return result;

    }

    static getYMD(dt: Date = null) {
        let sDate = "";
        if (dt == null)
            dt = new Date();

        try {
            sDate = Utilities.formatDate(dt, Session.getScriptTimeZone(), 'yyyy-MM-dd');
        }
        catch (ex) {
        }
        return sDate;
    }

    static getHM(dt: Date = null) {
        let sDate = "";
        if (dt == null)
            dt = new Date();
        try {
            sDate = Utilities.formatDate(dt, Session.getScriptTimeZone(), 'HH:mm');
        }
        catch(ex)
        {

        }
        return sDate;
    }

    static getDocTextByName(


z)
	addiu	$2, %pcrel_lo(baz + 4)
	auipc	$2, %pcrel_hi(baz)
	addiu	$2, %pcrel_lo(baz + 4)
	auipc	$2, %pcrel_hi(baz)
	addiu	$2, %pcrel_lo(baz + 4)
	auipc	$2, %pcrel_hi(baz)
	addiu	$2, %pcrel_lo(baz + 4)
	.set	mips0
	.set	reorder
	.end	foo

# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
	.align  4, 0
	.space  16

	.ifndef	reverse
	.ent	bar
bar:
	jalr	$0, $ra
	.end	bar

# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
	.align  16, 0
	.space  16

	.ent	baz
baz:
	jalr	$0, $ra
	.end	baz

# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
	.align  4, 0
	.space  16
	.endif


STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.text = ProtoField.new("Text", "jnx.equities.pts.ouch.v1.12.text", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.time_in_force = ProtoField.new("Time In Force", "jnx.equities.pts.ouch.v1.12.timeinforce", ftypes.UINT32)
omi_jnx_equities_pts_ouch_v1_12.fields.timestamp = ProtoField.new("Timestamp", "jnx.equities.pts.ouch.v1.12.timestamp", ftypes.UINT64)
omi_jnx_equities_pts_ouch_v1_12.fields.unsequenced_data_packet = ProtoField.new("Unsequenced Data Packet", "jnx.equities.pts.ouch.v1.12.unsequenceddatapacket", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.unsequenced_message = ProtoField.new("Unsequenced Message", "jnx.equities.pts.ouch.v1.12.unsequencedmessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.unsequenced_message_type = ProtoField.new("Unsequenced Message Type", "jnx.equities.pts.ouch.v1.12.unsequencedmessagetype", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.username = ProtoField.new("Username", "jnx.equities.pts.ouch.v1.12.username", ftypes.STRING)

-- Jnx Equities Pts Ouch 1.12 messages
omi_jnx_equities_pts_ouch_v1_12.fields.cancel_order_message = ProtoField.new("Cancel Order Message", "jnx.equities.pts.ouch.v1.12.cancelordermessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.enter_order_message = ProtoField.new("Enter Order Message", "jnx.equities.pts.ouch.v1.12.enterordermessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.order_accepted_message = ProtoField.new("Order Accepted Message", "jnx.equities.pts.ouch.v1.12.orderacceptedmessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.order_aiq_canceled_message = ProtoField.new("Order Aiq Canceled Message", "jnx.equities.pts.ouch.v1.12.orderaiqcanceledmessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.order_canceled_message = ProtoField.new("Order Canceled Message", "jnx.equities.pts.ouch.v1.12.ordercanceledmessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.order_executed_message = ProtoField.new("Order Executed Message", "jnx.equities.pts.ouch.v1.12.orderexecutedmessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.order_rejected_message = ProtoField.new("Order Rejected Message", "jnx.equities.pts.ouch.v1.12.orderrejectedmessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.order_replaced_message = ProtoField.new("Order Replaced Message", "jnx.equities.pts.ouch.v1.12.orderreplacedmessage", ftypes.STRING)
omi_jnx_equities_pts_ouch_v1_12.fields.replace_order_message = ProtoField.new("Replace Order Message", "jnx


	margin-top: 3.2em;
	margin-bottom: 1.6em;
}

.entry-content h5,
.entry-content h6,
.entry-summary h5,
.entry-summary h6,
.page-content h5,
.page-content h6,
.comment-content h5,
.comment-content h6 {
	letter-spacing: 0.1em;
	text-transform: uppercase;
}

.entry-content > h1:first-child,
.entry-content > h2:first-child,
.entry-content > h3:first-child,
.entry-content > h4:first-child,
.entry-content > h5:first-child,
.entry-content > h6:first-child,
.entry-summary > h1:first-child,
.entry-summary > h2:first-child,
.entry-summary > h3:first-child,
.entry-summary > h4:first-child,
.entry-summary > h5:first-child,
.entry-summary > h6:first-child,
.page-content > h1:first-child,
.page-content > h2:first-child,
.page-content > h3:first-child,
.page-content > h4:first-child,
.page-content > h5:first-child,
.page-content > h6:first-child,
.comment-content > h1:first-child,
.comment-content > h2:first-child,
.comment-content > h3:first-child,
.comment-content > h4:first-child,
.comment-content > h5:first-child,
.comment-content > h6:first-child {
	margin-top: 0;
}

.entry-content a,
.entry-summary a,
.page-content a,
.comment-content a,
.pingback .comment-body > a {
	border-bottom: 1px solid #333;
}

.entry-content a:hover,
.entry-content a:focus,
.entry-summary a:hover,
.entry-summary a:focus,
.page-content a:hover,
.page-content a:focus,
.comment-content a:hover,
.comment-content a:focus,
.pingback .comment-body > a:hover,
.pingback .comment-body > a:focus {
	border-bottom: 0;
}

.entry-content a img,
.entry-summary a img,
.page-content a img,
.comment-content a img {
	display: block;
}

.comments-area .more-link:after,
.entry-content .more-link,
.entry-summary .more-link:after {
	white-space: nowrap;
}

.author-info {
	border-top: 1px solid #eaeaea;
	border-top: 1px solid rgba(51, 51, 51, 0.1);
	margin: 0 7.6923%;
	padding: 7.6923% 0;
}

.author-info .avatar {
	float: left;
	height: 36px;
	margin: 0 1.6em 1.6em 0;
	width: 36px;
}

.author-heading {
	color: #707070;
	color: rgba(51, 51, 51, 0.7);
	font-family: "Open Sans", sans-serif;
	font-size: 12px;
	font-size: 1.2rem;
	letter-spacing: 0.04em;
	margin-bottom: 1.5em;
	text-transform: uppercase;
}

.author-title {
	clear: none;
}

.author-bio {
	font-size: 12px;
	font-size: 1.2rem;
	line-height: 1.5;
	overflow: hidden;
	padding-bottom: 1px;
}

.author-description {
	-webkit-hyphens: auto;
	-moz-hyphens:


page_indicator.dart';
import 'package:handygram/src/pages/chat_send/pages/gifs.dart';
import 'package:handygram/src/pages/chat_send/pages/photos.dart';
import 'package:handygram/src/pages/chat_send/pages/stickers.dart';
import 'package:handygram/src/pages/chat_send/pages/text.dart';
import 'package:handygram/src/pages/chat_send/pages/voice.dart';

import 'package:handy_tdlib/api.dart' as td;

class ChatSendPage extends StatefulWidget {
  const ChatSendPage({
    super.key,
    required this.chatId,
    this.viewId,
    this.replyToMessageId,
    this.messageThreadId,
  });

  final int chatId;
  final String? viewId;
  final int? messageThreadId;
  final int? replyToMessageId;

  @override
  State<ChatSendPage> createState() => _ChatSendPageState();
}

class MessageSendInfo {
  final int chatId;
  final int? messageThreadId;
  final int? replyToMessageId;
  final Function(td.InputMessageContent, {bool wait}) sendMessage;
  final td.DraftMessage? draft;

  const MessageSendInfo({
    required this.chatId,
    required this.sendMessage,
    this.messageThreadId,
    this.replyToMessageId,
    this.draft,
  });
}

class _ChatSendPageState extends State<ChatSendPage> {
  late final initialPage = switch (widget.viewId) {
    "media" => 0, // stickers - 0, gifs - 1
    "photo" => 2,
    "voice" => 4,
    //"file" => 5,
    "text" || _ => 3,
  };
  late final controller = PageController(initialPage: initialPage);
  late int currentPage = initialPage;

  void _sendMessage(td.InputMessageContent content, {bool wait = true}) async {
    final future = CurrentAccount.providers.messages.sendMessage(
      widget.chatId,
      content,
      replyTo: widget.replyToMessageId == null
          ? null
          : td.InputMessageReplyToMessage(
              messageId: widget.replyToMessageId!,
            ),
      messageThreadId: widget.messageThreadId,
    );
    if (wait) await future;
    if (mounted && context.mounted) GoRouter.of(context).pop();
  }

  @override
  Widget build(BuildContext context) {
    final info = MessageSendInfo(
      chatId: widget.chatId,
      replyToMessageId: widget.replyToMessageId,
      sendMessage: _sendMessage,
      messageThreadId: widget.messageThreadId,
    );

    final children = [
      ChatSendStickerPage(info), // 0
      ChatSendGIFPage(info), //     1
      ChatSendPhotoPage(info), //   2
      ChatSendTextPage(info), //    3
      ChatSendVoicePage(info), //   4
      //ChatSendFilePage(info), //    5
    ];

    return Scaffold(
      body: AnimatedSwitcher(
        duration: const Duration(milliseconds: 200),
        child: PageIndicator(
          pageCount: children.length,
          currentPage: currentPage,
          child: PageView(
            controller: controller,
            onPageChanged: (index) => setState(() => currentPage = index),
            physics: const BouncingScrollPhysics(),
            children: children,
          ),
        ),
      ),
    );
  }
}
/*
 * Copyright (C) Roman Rikhter <teledurak@gmail.com>, 2024
 * This program comes with ABSOLUTELY NO WARRANTY;
 * This is free software, and you are welcome to redistribute it under certain conditions;
 *
 * See /LICENSE for more details.
 */

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:handygram/src/pages/setup/bloc.dart';
import 'package:handygram/src/pages/setup/stages/authorization/bloc.dart';
import 'package:handygram/src/pa


32(dev, NV04_PFIFO_CACHE1_PULL0, 1);

			status &= ~NV_PFIFO_INTR_CACHE_ERROR;
		}

		if (status & NV_PFIFO_INTR_DMA_PUSHER) {
			u32 dma_get = nv_rd32(dev, 0x003244);
			u32 dma_put = nv_rd32(dev, 0x003240);
			u32 push = nv_rd32(dev, 0x003220);
			u32 state = nv_rd32(dev, 0x003228);

			if (dev_priv->card_type == NV_50) {
				u32 ho_get = nv_rd32(dev, 0x003328);
				u32 ho_put = nv_rd32(dev, 0x003320);
				u32 ib_get = nv_rd32(dev, 0x003334);
				u32 ib_put = nv_rd32(dev, 0x003330);

				if (nouveau_ratelimit())
					NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%02x%08x "
					     "Put 0x%02x%08x IbGet 0x%08x IbPut 0x%08x "
					     "State 0x%08x (err: %s) Push 0x%08x\n",
						chid, ho_get, dma_get, ho_put,
						dma_put, ib_get, ib_put, state,
						nv_dma_state_err(state),
						push);

				/* METHOD_COUNT, in DMA_STATE on earlier chipsets */
				nv_wr32(dev, 0x003364, 0x00000000);
				if (dma_get != dma_put || ho_get != ho_put) {
					nv_wr32(dev, 0x003244, dma_put);
					nv_wr32(dev, 0x003328, ho_put);
				} else
				if (ib_get != ib_put) {
					nv_wr32(dev, 0x003334, ib_put);
				}
			} else {
				NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%08x "
					     "Put 0x%08x State 0x%08x (err: %s) Push 0x%08x\n",
					chid, dma_get, dma_put, state,
					nv_dma_state_err(state), push);

				if (dma_get != dma_put)
					nv_wr32(dev, 0x003244, dma_put);
			}

			nv_wr32(dev, 0x003228, 0x00000000);
			nv_wr32(dev, 0x003220, 0x00000001);
			nv_wr32(dev, 0x002100, NV_PFIFO_INTR_DMA_PUSHER);
			status &= ~NV_PFIFO_INTR_DMA_PUSHER;
		}

		if (status & NV_PFIFO_INTR_SEMAPHORE) {
			uint32_t sem;

			status &= ~NV_PFIFO_INTR_SEMAPHORE;
			nv_wr32(dev, NV03_PFIFO_INTR_0,
				NV_PFIFO_INTR_SEMAPHORE);

			sem = nv_rd32(dev, NV10_PFIFO_CACHE1_SEMAPHORE);
			nv_wr32(dev, NV10_PFIFO_CACHE1_SEMAPHORE, sem | 0x1);

			nv_wr32(dev, NV03_PFIFO_CACHE1_GET, get + 4);
			nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, 1);
		}

		if (dev_priv->card_type == NV_50) {
			if (status & 0x00000010) {
				nv50_fb_vm_trap(dev, nouveau_ratelimit());
				status &= ~0x00000010;
				nv_wr32(dev, 0x002100, 0x00000010);
			}
		}

		if (status) {
			if (nouveau_ratelimit())
				NV_INFO(dev, "PFIFO_INTR 0x%08x - Ch %d\n",
					status, chid);
			nv_wr32(dev, NV03_PFIFO_INTR_0, status);
			status = 0;
		}

		nv_wr32(dev, NV03_PFIFO_CACHES, reassign);
	}

	if (status) {
		NV_INFO(dev, "PFIFO still angry after %d spins, halt\n", cnt);
		nv_wr32(dev, 0x2140, 0);
		nv_wr32(dev, 0x140, 0);
	}

	nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PFIFO_PENDING);
}


Mount에 대해서 얘기해보려고 합니다. 두 방법이 어떻게 다른지 증명하고 설명하겠습니다.

이후에는 컴포넌트를 테스트 할 때 발생하는 다양한 시나리오를 테스트 하는 방법을 다룹니다. 테스트 할 컴포넌트는 아래와 같습니다.

props 받기

컴퓨티드 프로퍼티

다른 컴포넌트 렌더

이벤트 방출

더 나아가서 아래와 같은 좀 더 흥미로운 경우도 살펴보겠습니다.

Vuex 테스트 모범 사례 (컴포넌트에서, 그리고 독립적으로)

Vue 라우터 테스트

3rd 파티 컴포넌트를 포함한 테스트

아래의 예시와 같이, Jest의 API를 사용해서 작성한 테스트를 좀더 견고하게 만드는 방법도 알아봅니다.

API 응답 모킹하기

모듈 모킹과 스파잉

스냅샷 사용

# 더 읽을거리

아래의 유용한 자료들도 포함하고 있습니다.

공식 문서<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>

vue-test-utils의 저작자가 쓴 책<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0


document.getById(b._.inputId),f.initialized=!0);if(d){var k;e="find"===e?1:0;var f=1-e,l,g=q.length;for(l=0;l<g;l++)h=this.getContentElement(x[e],
q[l][e]),k=this.getContentElement(x[f],q[l][f]),k.setValue(h.getValue())}}})},onShow:function(){f.searchRange=r();var a=this._.currentTabId,b=this.getParentEditor().getSelection().getSelectedText(),c=this.getContentElement(a,"find"==a?"txtFindFind":"txtFindReplace");c.setValue(b);c.select();this[("find"==a&&this._.editor.readOnly?"hide":"show")+"Page"]("replace")},onHide:function(){var a;f.matchRange&&f.matchRange.isMatched()&&(f.matchRange.removeHighlight(),(a=f.matchRange.toDomRange())&&c.getSelection().selectRanges([a]),
c.focus());delete f.matchRange},onFocus:function(){return"replace"==this._.currentTabId?this.getContentElement("replace","txtFindReplace"):this.getContentElement("find","txtFindFind")}}})})();/*
 Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
CKEDITOR.dialog.add("button",function(b){function d(a){var b=this.getValue();b?(a.attributes[this.id]=b,"name"==this.id&&(a.attributes["data-cke-saved-name"]=b)):(delete a.attributes[this.id],"name"==this.id&&delete a.attributes["data-cke-saved-name"])}return{title:b.lang.forms.button.title,minWidth:350,minHeight:150,onShow:function(){delete this.button;var a=this.getParentEditor().getSelection().getSelectedElement();a&&a.is("input")&&a.getAttribute("type")in{button:1,reset:1,submit:1}&&(this.button=
a,this.setupContent(a))},onOk:function(){var a=this.getParentEditor(),b=this.button,d=!b,c=b?CKEDITOR.htmlParser.fragment.fromHtml(b.getOuterHtml()).children[0]:new CKEDITOR.htmlParser.element("input");this.commitContent(c);var e=new CKEDITOR.htmlParser.basicWriter;c.writeHtml(e);c=CKEDITOR.dom.element.createFromHtml(e.getHtml(),a.document);d?a.insertElement(c):(c.replace(b),a.getSelection().selectElement(c))},contents:[{id:"info",label:b.lang.forms.button.title,title:b.lang.forms.button.title,elements:[{id:"name",
type:"text",bidi:!0,label:b.lang.common.name,"default":"",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:d},{id:"value",type:"text",label:b.lang.forms.button.text,accessKey:"V","default":"",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:d},{id:"type",type:"select",label:b.lang.forms.button.type,"default":"button",accessKey:"T",items:[[b.lang.forms.button.typeBtn,"button"],[b.lang.forms.button.typeSbm,"submit"],[b.lang.forms.button.typeRst,
"reset"]],setup:function(a){this.setValue(a.getAttribute("type")||"")},commit:d}]}]}});/*
 Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
CKEDITOR.dialog.add("textarea",function(b){return{title:


    proc_vars_addr: u16,
}

#[allow(dead_code)]
#[derive(Debug)]
pub struct PublicSymbol {
    label: String,
    address: u16,
    symbol_type: char,
    label_type: char,
}

impl RelBlock {
    fn convert(
        &self,
        relocations: &[Relocations],
        public_symbols: &[PublicSymbol],
        obj: &mut Artifact,
        align: Option<u64>,
    ) {
        let start_symbol_name = ".text.sprites";
        obj.declare(
            start_symbol_name,
            Decl::section(SectionKind::Text).with_align(align),
        )
        .unwrap();
        // obj.define(start_symbol_name, self.data.clone()).unwrap();
        let symbols = public_symbols
            .iter()
            .map(|s| (s.label.clone(), s.address as u64))
            .collect();
        obj.define_with_symbols(start_symbol_name, self.data.clone(), symbols)
            .unwrap();
        let mut declarations = HashMap::<u16, String>::new();
        declarations.insert(0, format!("__start"));
        declarations.insert(self.data.len() as u16, format!("__end"));

        let mut addresses = declarations.keys().collect::<Vec<_>>();
        addresses.sort();

        for rel in relocations {
            for i in rel.offsets() {
                let link = Link {
                    from: start_symbol_name,
                    to: start_symbol_name,
                    at: i.0 as u64,
                };
                let (reloc, addend) = match rel.blk_type {
                    'W' => {
                        let mut idx = i.0 as usize;
                        (R_MOS_ADDR16, read_u16(&self.data, &mut idx) as i32)
                    }
                    '<' => (R_MOS_ADDR16_LO, self.data[i.0 as usize] as i32),
                    '>' => (
                        R_MOS_ADDR16_HI,
                        self.data[i.0 as usize] as i32 * 256 + i.1 as i32,
                    ),
                    _ => todo!(),
                };
                obj.link_with(link, Reloc::Raw { reloc, addend }).unwrap();
            }
        }
    }
}

#[derive(Debug)]
pub struct Relocations {
    blk_type: char,
    item_size: usize,
    data: Vec<u8>,
}

impl Relocations {
    fn offsets(&self) -> Vec<(u16, u8)> {
        let mut ret = Vec::new();
        let mut index = 0;
        while index < self.data.len() {
            let offs = read_u16(&self.data, &mut index);
            let extra = if self.item_size == 3 {
                self.data[index]
            } else {
                0
            };
            index += self.item_size - 2; // 2 is added by above read_u16
            ret.push((offs, extra));
        }
        ret
    }
}

fn read<T>(buf: &[u8], index: &mut usize) -> T
where
    T: Copy,
{
    let ret = unsafe { *(&buf[*index] as *const u8 as *const T) };
    *index += std::mem::size_of::<T>();
    ret
}

fn read_u16(buf: &[u8], index: &mut usize) -> u16 {
    read(buf, index)
}
<filename>src/tests/model/reactive_relation_instance_test.rs
use crate::api::{PropertyInstanceGetter, PropertyInstanceSetter};
use crate::model::{ReactiveEntityInstance, ReactiveRelationInstance, ReactivePropertyInstance, RelationInstance};
use crate::tests::{create_random_entity_instance, r_json_string};
use crate::tests::utils::r_string;
use indradb::{Type, NamedProperty, EdgeProperties, Edge, EdgeKey};
use


function RealmWizard_OnLoad(self)
	self:SetCamera(0);
	self:SetSequence(0);

	ShowScene(RealmWizard);
	--if (IsStreamingTrial()) then
	--	AccountLoginCinematicsButton:Disable();
	--	RealmWizard:SetModel("Interface\\Glues\\Models\\UI_MainMenu\\UI_MainMenu.m2");
	--else
	--	RealmWizard:SetModel("Interface\\Glues\\Models\\UI_MainMenu_Northrend\\UI_MainMenu_Northrend.m2");
	--end
end

function RealmWizard_OnShow(self)
	self:SetSequence(0);
	RealmWizardGameTypeButton1:Click(1);
	if ( not RealmWizard.selectedCategory ) then
		RealmWizardSuggest:Disable();
	end
	RealmWizard_UpdateCategories(GetRealmCategories());
end

function RealmWizard_OnHide(self)
	StopAllSFX( 1.0 );
end

function RealmWizard_UpdateCategories(...)
	local numTabs = select("#", ...);
	local button, buttonText;
	local numCategoriesShown = 0;

	local categoryIndex = 1;
	for i=1, MAX_REALM_CATEGORY_TABS do
		button = _G["RealmWizardLocationButton"..i];
		buttonText = _G["RealmWizardLocationButton"..i.."Text"];
		while (IsTournamentRealmCategory(categoryIndex)) do
			categoryIndex = categoryIndex + 1;
			if (categoryIndex > numTabs) then
				break;
			end
		end
		if ( c


, r6, lr}
	add r5, r0, #0
	bl sub_0205F394
	add r4, r0, #0
	add r0, r5, #0
	add r1, r4, #0
	bl sub_02065CD0
	cmp r0, #0
	beq _02065990
	ldr r6, _02065994 ; =_020FE424
_02065980:
	ldrb r2, [r4]
	add r0, r5, #0
	add r1, r4, #0
	lsl r2, r2, #2
	ldr r2, [r6, r2]
	blx r2
	cmp r0, #1
	beq _02065980
_02065990:
	pop {r4, r5, r6, pc}
	nop
_02065994: .word _020FE424
	thumb_func_end sub_02065968

	thumb_func_start sub_02065998
sub_02065998: ; 0x02065998
	bx lr
	.balign 4, 0
	thumb_func_end sub_02065998

	thumb_func_start sub_0206599C
sub_0206599C: ; 0x0206599C
	push {r3, lr}
	bl sub_0205F394
	ldrb r0, [r0, #3]
	pop {r3, pc}
	.balign 4, 0
	thumb_func_end sub_0206599C

	thumb_func_start sub_020659A8
sub_020659A8: ; 0x020659A8
	push {r3, lr}
	bl sub_0205F394
	ldrh r0, [r0, #0xa]
	lsl r0, r0, #0x1d
	lsr r0, r0, #0x1e
	pop {r3, pc}
	.balign 4, 0
	thumb_func_end sub_020659A8

	thumb_func_start sub_020659B8
sub_020659B8: ; 0x020659B8
	push {r3, lr}
	bl sub_0205F394
	ldrh r2, [r0, #0xa]
	mov r1, #1
	bic r2, r1
	mov r1, #1
	orr r1, r2
	strh r1, [r0, #0xa]
	pop {r3, pc}
	thumb_func_end sub_020659B8

	thumb_func_start sub_020659CC
sub_020659CC: ; 0x020659CC
	push {r3, r4, r5, r6, r7, lr}
	add r5, r0, #0
	bl MapObject_GetFieldSystem
	add r4, r0, #0
	add r0, r5, #0
	bl sub_0205F394
	add r6, r0, #0
	add r0, r5, #0
	bl MapObject_ClearSingleMovement
	add r0, r5, #0
	bl MapObject_ClearFlag3
	add r0, r5, #0
	mov r1, #0x20
	bl MapObject_ClearFlagsBits
	add r0, r5, #0
	mov r1, #0xff
	bl MapObject_SetMovementCommand
	add r0, r5, #0
	mov r1, #0
	bl MapObject_SetMovementStep
	mov r1, #0
	add r0, r4, #0
	strb r1, [r6]
	add r0, #0xe8 ; ->followMon.effectTimer
	str r1, [r0]
	mov r0, #1
	lsl r0, r0, #8 ; ->followMon.fieldSystem
	str r1, [r4, r0]
	add r0, r4, #0
	add r0, #0xec ; ->followMon.duration
	str r1, [r0]
	add r4, #0xf0 ; ->followMon.parentData


8YIUzLuNs4ILuLeH94EB8YIUzLuNs4INBbeH94EB8YIUzLuNs4IOU7eH94EB8YIUzLuNs4IPoLeH94EB8YIUzLuNs4IQ7beH94EB8YIUzLuNs4ISO7eH94EB8YIUzBFNm3SPTbuMU6uEH0O2dVOsghTM";
          videoElement.appendChild(webmSource);

          document.body.appendChild(videoElement);

          this.async(function() {
            // Ideally, we'll get a 'playing' event if we're on a browser that supports programmatic play().
            videoElement.onplaying = function(e) {
              clearTimeout(timeout);

              this.playsupported = (e && e.type === 'playing') || videoElement.currentTime !== 0;
              this._playsupportedLocalStorage = this.playsupported;

              videoElement.onplaying = null;

              document.body.removeChild(videoElement);
            }.bind(this);

            // If we haven't received a 'playing' event within 500ms, then we're most likely on a browser that doesn't
            // support programmatic plays. Do a final check after 500ms and set this.playsupported at that point.
            timeout = setTimeout(videoElement.onplaying, 500);

            // Try to initiate playback...
            videoElement.play();
          });
        } else {
          // If there's no play() method then we know that it's not supported.
          this.playsupported = false;
          this._playsupportedLocalStorage = false;
        }
      }
    },

    /**
     * Sets fluid width/height.
     *
     * If the fluid attribute is set, the aspect ratio of the video will
     * be inferred (if set in pixels), or assumed to be 16:9. The element
     * will give itself enough top padding to force the player to use the
     * correct aspect ratio, even as the screen size changes.
     *
     */
    ready: function() {
      if (this.hasAttribute('fluid')) {
        var ratio = parseInt(this.height, 10) / parseInt(this.width, 10);
        if (isNaN(ratio)) {
          ratio = 9/16;
        }
        ratio *= 100;
        this.width = '100%';
        this.height = 'auto';
        this.style['padding-top'] = ratio + '%';
      }
    },

    /**
     * Clean up the underlying Player `<iframe>` when we're removed from the DOM.
     */
    detached: function() {
      if (this._player) {
        this._player.destroy();
      }
    },

    /**
     * Plays the current video.
     *
     * Note that on certain mobile browsers, playback
     * [can't be initiated programmatically](https://developers.google.com/youtube/iframe_api_reference#Mobile_considerations).
     *
     * If `this.playsupported` is not `true`, calling `play()` will have no effect.
     *
     * @method play
     */
    play: function() {
      if (this._player && this._player.playVideo && this.playsupported) {
        this._player.playVideo();
      }
    },

    /**
     * Modifies the volume of the current video.
     *
     * Developers should take care not to break expected user experience by programmatically
     * modifying the volume on mobile browsers.
     * Note that the YouTube player, in addition, does not display volume controls in a
     * mobile environment.
     *
     * @method setVolume
     * @param {number} volume The new volume, an integer between 0 (muted) and 100 (loudest).
     */
    setVolume: function(volume) {
      if (this._player && this._player.setVolume) {
        this._player.setVolume(volume);
      }
    },

    /**
     * Mutes the current video.
     *
     * Developers should take care not to break expected user experience by programmatically
     * modifying the volume on mobile browsers.


    PluginEntrySelectorPreservedSubjectScript -> "計算式"
    PluginEntrySelectorComparerValue -> "入力値"
    PluginEntrySelectorPreviewSummaryError -> "無効な入力値"
    PluginEntrySelectorPreviewSummaryInitializing -> "初期化中..."
    PluginEntrySelectorPreviewSummary -> "選択中 %d/%d"
    PluginEntrySelectorPlaceholder -> "フィルターがないため、全てのエントリが選択されます"
    PluginEntrySelectorExpressionTitle -> "論理式"
    PluginEntrySelectorExpressionDescription ->
        "上記で設定したフィルターを組み合わせる論理式です。\n" +
            "使用可能なトークン：`and`, `or`, `not`, `xor`, `(`, `)`, `#1`, `#2` など。"
    EditorSubTitleMultiple -> "サンプル %2\$s の中の%1\$dエントリを編集"
    FailedToLoadSampleFileError ->
        "サンプルファイルを読み込めませんでした。存在しないか、サポートされていないフォーマットの可能性があります。"
    PluginRuntimeUnexpectedException ->
        "プラグインの実行中に予期しないエラーが発生しました。" +
            "エラーログを添付し、プラグインの作者に連絡してください。"
    FailedToCreateProjectException ->
        "プロジェクトを作成できませんでした。お使いのラベラーまたはプラグインの設定を確認してください。" +
            "問題が解決できない場合は、エラーログを添付し、ラベラーまたはプラグインの作者に連絡してください。"
    InvalidCreatedProjectException ->
        "作成したプロジェクトは無効です。お使いのラベラーまたはプラグインの設定を確認してください。" +
            "問題が解決できない場合は、エラーログを添付し、ラベラーまたはプラグインの作者に連絡してください。"
    FailedToCreateProjectNoSampleException ->
        "サンプルディレクトリにサンプルファイルが見つからなかったため、" +
            "プロジェクトを作成できませんでした。"
    InvalidOpenedProjectException -> "プロジェクトを開けませんでした。無効なデータが含まれています。詳細はエラーログを確認してください。"
    ProjectParseException ->
        "プロジェクトを開けませんでした。破損しているか、互換性のないのバージョンの vLabeler によって作られています。" +
            "新規プロジェクトを作成し、メニューの `ファイル` -> `インポート...` " +
            "を使用してプロジェクトファイルをインポートしてください。"
    ProjectImportException ->
        "ファイルをインポートできませんでした。\n" +
            "無効な vLabeler プロジェクトファイルである可能性があります。詳細はエラーログを確認してください。"
    ProjectUpdateOnSampleException ->
        "プロジェクトのデータとサンプルのデータをマッチングできませんでした。詳細はエラーログを確認してください。"
    InvalidEditedProjectException -> "この編集は無効です。詳細はエラーログを確認してください。"
    CustomizableItemLoadingException -> "コンポーネントを読み込めませんでした。"
    CustomizableItemRemovingException -> "コンポーネントを削除できませんでした。"
    VideoComponentInitializationException ->
        "ビデオコンポーネントを初期化できませんでした。この機能を使用するには、VLC をインストールする必要があります。" +
            "詳細については、README の `ビ


tcc1"]?.contains(key) ?? false)) {
        return ImageSpan(AssetImage(emojiUtil.emojiMap[key]!, package: "tim_ui_kit_sticker_plugin"),
            actualText: key,
            imageWidth: size,
            imageHeight: size,
            start: start!,
            // fit: BoxFit.cover,
            margin: const EdgeInsets.all(0));
      } else {
        return ImageSpan(AssetImage(emojiUtil.emojiMap[key]!),
            actualText: key,
            imageWidth: size,
            imageHeight: size,
            start: start!,
            // fit: BoxFit.cover,
            margin: const EdgeInsets.all(0));
      }
    }

    return TextSpan(text: toString(), style: textStyle);
  }
}

class EmojiUtil {
  // Private constructor initializing the emoji data
  EmojiUtil._internal(
      {required this.isUseQQPackage,
      required this.isUseTencentCloudChatPackage,
      required this.isUseTencentCloudChatPackageOldKeys,
      required this.customEmojiStickerList}) {
    _emojiMap.addAll(loadDefaultEmojis());

    final customEmojis = loadCustomEmojis();
    _emojiMap.addAll(customEmojis.$1);
    _emojiKeyCategoryMap["custom"] = customEmojis.$2;
  }

  final bool isUseQQPackage;
  final bool isUseTencentCloudChatPackage;
  final bool isUseTencentCloudChatPackageOldKeys;
  final List<CustomEmojiFaceData> customEmojiStickerList;

  // Load the default emojis into a Map
  Map<String, String> loadDefaultEmojis() {
    Map<String, String> defaultEmojiMap = {};
    for (final emojiGroup in TUIKitStickerConstData.emojiList) {
      final groupName = emojiGroup.name;
      final keyList = [];
      if (isUseQQPackage && groupName == "4349") {
        for (final emoji in emojiGroup.list) {
          String emojiName = emoji.split('.png')[0];
          defaultEmojiMap['[$emojiName]'] = '$_emojiFilePath/$groupName/$emojiName.png';
          keyList.add('[$emojiName]');

          final zhKey = TUIKitStickerConstData.emoji4349ZhMapList[emojiName];
          defaultEmojiMap['[$zhKey]'] = '$_emojiFilePath/$groupName/$emojiName.png';
          keyList.add('[$zhKey]');
        }
        _emojiKeyCategoryMap[groupName] = keyList;
      }

      if (isUseTencentCloudChatPackage && groupName == "tcc1") {
        for (final emoji in emojiGroup.list) {
          String emojiName = emoji.split('.png')[0];
          String compatibleEmojiName = emojiName;
          if (isUseTencentCloudChatPackageOldKeys) {
            // use old emoji keys in 3.x version
            compatibleEmojiName = getCompatibleEmojiName(emojiName);
          }

          defaultEmojiMap['[$compatibleEmojiName]'] = '$_emojiFilePath/$groupName/$emojiName.png';
          keyList.add('[$compatibleEmojiName]');
        }
        _emojiKeyCategoryMap[groupName] = keyList;
      }
    }
    return defaultEmojiMap;
  }

  // Load the custom emojis into a Map
  (Map<String, String>, List<String>) loadCustomEmojis() {
    Map<String, String> customEmojiMap = {};
    List<String> keyList = [];
    for (final customEmojiGroup in customEmojiStickerList) {
      for (final customEmoji in customEmojiGroup.list) {
        String customEmojiName = customEmoji.split('.png')[0];
        customEmojiMap['[$customEmojiName]'] = '$_emojiFilePath/${customEmojiGroup.name}/$customEmojiName.png';
        keyList.add('[$customEmojiName]');
      }
    }
    return (customEmojiMap, keyList);
  }

  // A Map instance variable to store the emojis and their paths


aNosGongqiTargetMod = sgs.CreateTargetModSkill{
	name = "#LuaNosGongqi-target" ,

	distance_limit_func = function(self, player, card)
		if card:getSkillName() == "LuaNosGongqi" then
			return 1000
		else
			return 0
		end
	end
}
--[[
	技能名：攻心
	相关武将：神·吕蒙，界·吕蒙
	描述：出牌阶段限一次，你可以观看一名其他角色的手牌，然后选择其中一张♥牌并选择一项：弃置之，或将之置于牌堆顶。
	引用：LuaGongxin
	状态：0405验证通过
]]--

LuaGongxinCard = sgs.CreateSkillCard{
	name = "LuaGongxinCard" ,
	filter = function(self, targets, to_select)
		return #targets == 0 and to_select:objectName() ~= sgs.Self:objectName() --and not to_select:isKongcheng() 如果不想选择没有手牌的角色就加上这一句，源码是没有这句的
	end ,
	on_effect = function(self, effect)
		local room = effect.from:getRoom()
		if not effect.to:isKongcheng() then--如果加上了上面的那句，这句和对应的end可以删除
			local ids = sgs.IntList()
			for _, card in sgs.qlist(effect.to:getHandcards()) do
				if card:getSuit() == sgs.Card_Heart then
					ids:append(card:getEffectiveId())
				end
			end
			local card_id = room:doGongxin(effect.from, effect.to, ids)
			if (card_id == -1) then return end
			local result = room:askForChoice(effect.from, "LuaGongxin", "discard+put")
			effect.from:removeTag("LuaGongxin")
			if result == "discard" then
				local reason = sgs.CardMoveReason(sgs.CardMoveReason_S_REASON_DISMANTLE, effect.from:objectName(), nil, "LuaGongxin", nil)
				room:throwCard(sgs.Sanguosha:getCard(card_id), reason, effect.to, effect.from)
			else
				effect.from:setFlags("Global_GongxinOperator")
				local reason = sgs.CardMoveReason(sgs.CardMoveReason_S_REASON_PUT, effect.from:objectName(), nil, "LuaGongxin", nil)
				room:moveCardTo(sgs.Sanguosha:getCard(card_id), effect.to, nil, sgs.Player_DrawPile, reason, true)
				effect.from:setFlags("-Global_GongxinOperator")
			end
		end
	end
}
LuaGongxin = sgs.CreateZeroCardViewAsSkill{
	name = "LuaGongxin" ,
	view_as = function()
		return LuaGongxinCard:clone()
	end ,
	enabled_at_play = function(self, target)
		return not target:hasUsed("#LuaGongxinCard")
	end
}
--[[
	技能名：共谋
	相关武将：倚天·钟士季
	描述：回合结束阶段开始时，你可指定一名其他角色：其在摸牌阶段摸牌后，须给你X张手牌（X为你手牌数与对方手牌数的较小值），然后你须选择X张手牌交给对方
	引用：LuaXGongmou、LuaXGongmouExchange
	状态：1217验证通过
]]--
LuaXGongmou = sgs.CreateTriggerSkill{
	name = "LuaXGongmou",
	frequency = sgs.Skill_


versationModal.somethingWentWrong":"Došlo je do pogreške...","sharedConversationModal.title":"Podijeljene poveznice","sharingModal.advancedDataAnalysisSupportDisclaimer":"Primatelji neće moći pregledavati slike ni datoteke za preuzimanje napredne analize podataka.","sharingModal.bizDescription.1":"Samo članovi vašeg radnog prostora s URL-om vidjet će zadnje poruke poslane u ovom razgovoru. Datoteke koje priložite razgovoru neće se dijeliti, no sadržaji datoteka referencirani u porukama i dalje će biti vidljivi.","sharingModal.confirmDeleteLink":"Jeste li sigurni da želite izbrisati poveznicu za dijeljenje?","sharingModal.deleteLink":"Izbriši poveznicu","sharingModal.description":"Poruke koje pošaljete nakon stvaranja poveznice neće se dijelite. Svatko s URL-om moći će vidjeti podijeljeni razgovor.","sharingModal.exisitingDescription":"Već ste podijelili <existingLink>ovaj razgovor</existingLink>. Ako želite ažurirati sadržaj podijeljenog razgovora, <deleteLink>izbrišite ovu poveznicu</deleteLink> i stvorite novu podijeljenu poveznicu.","sharingModal.moderationBlocked":"Ovaj je podijeljena veza onemogućena moderacijom.","sharingModal.personalizedDataDisclaimer":"Svi personalizirani podaci koji se ne nalaze u razgovoru neće se dijeliti s osobama koje ga pregledavaju (npr. prilagođene upute).","sharingModal.shareAnonymously":"Podijeli anonimno","sharingModal.shareYourName":"Podijelite svoje ime","shLmv5":"Izbriši GPT","sidebar.hideFromSidebar":"Sakrij s bočne trake","SidekickOnboarding.banner_content":"Pristupite ChatGPT-ju s bilo kojeg zaslona novim pokretačem, podijelite snimke zaslona i vodite glasovne razgovore.","SidekickOnboarding.close":"Zatvori","SidekickOnboarding.disclaimer":"Dostupno samo za macOS s procesorom Apple Silicon. <learnMoreLink>Saznajte više</learnMoreLink>.","SidekickOnboarding.download":"Preuzmi","SidekickOnboarding.modal_content":"Učinite više aplikacijom za radnu površinu. Pristupite ChatGPT-ju s bilo kojeg zaslona novim pokretačem, podijelite snimke zaslona i vodite glasovne razgovore.","SidekickOnboarding.title":"ChatGPT je sada dostupan za macOS","SidekickOnboarding.toast_content":"Učinite više aplikacijom za radnu površinu. Pristupite ChatGPT-ju s bilo kojeg zaslona novim pokretačem, podijelite snimke zaslona i vodite glasovne razgovore. Dostupno samo za macOS s procesorom Apple Silicon. <learnMoreLink>Saznajte više</learnMoreLink>.","sJl/nl":"Javna poveznica za vaše čavrljanje je ažurirana. Upravljajte prethodno podijeljenim čavrljanjima pomoću mogućnosti <settingsLink>Postavke</settingsLink>.","speechSettings.content.autoDetect":"Automatsko otkrivanje","speechSettings.content.autoDetectDescription":"Za najbolje rezultate odaberite jezik koji najčešće govorite. Ako ga nema na popisu, automatsko otkrivanje i dalje ga može podržavati.","speechSettings.content.language":"Glavni jezik","speechSettings.content.voice":"Glas","speechSettings.trigger":"Govor","sr8Qp/


_ = 0 == t /* ERROR "mismatched types untyped int and untyped bool" */
	var b bool
	var x, y float32
	b = x < y
	_ = b
	_ = struct{b bool}{x < y}
}

// corner cases
var (
	v0 = nil == nil // ERROR "operator == not defined on untyped nil"
)

func arrays() {
	// basics
	var a, b [10]int
	_ = a == b
	_ = a != b
	_ = a /* ERROR "< not defined" */ < b
	_ = a == nil /* ERROR "mismatched types" */

	type C [10]int
	var c C
	_ = a == c

	type D [10]int
	var d D
	_ = c == d /* ERROR "mismatched types" */

	var e [10]func() int
	_ = e /* ERROR "[10]func() int cannot be compared" */ == e
}

func structs() {
	// basics
	var s, t struct {
		x int
		a [10]float32
		_ bool
	}
	_ = s == t
	_ = s != t
	_ = s /* ERROR "< not defined" */ < t
	_ = s == nil /* ERROR "mismatched types" */

	type S struct {
		x int
		a [10]float32
		_ bool
	}
	type T struct {
		x int
		a [10]float32
		_ bool
	}
	var ss S
	var tt T
	_ = s == ss
	_ = ss == tt /* ERROR "mismatched types" */

	var u struct {
		x int
		a [10]map[string]int
	}
	_ = u /* ERROR "cannot be compared" */ == u
}

func pointers() {
	// nil
	_ = nil == nil // ERROR "operator == not defined on untyped nil"
	_ = nil != nil // ERROR "operator != not defined on untyped nil"
	_ = nil /* ERROR "< not defined" */ < nil
	_ = nil /* ERROR "<= not defined" */ <= nil
	_ = nil /* ERROR "> not defined" */ > nil
	_ = nil /* ERROR ">= not defined" */ >= nil

	// basics
	var p, q *int
	_ = p == q
	_ = p != q

	_ = p == nil
	_ = p != nil
	_ = nil == q
	_ = nil != q

	_ = p /* ERROR "< not defined" */ < q
	_ = p /* ERROR "<= not defined" */ <= q
	_ = p /* ERROR "> not defined" */ > q
	_ = p /* ERROR ">= not defined" */ >= q

	// various element types
	type (
		S1 struct{}
		S2 struct{}
		P1 *S1
		P2 *S2
	)
	var (
		ps1 *S1
		ps2 *S2
		p1 P1
		p2 P2
	)
	_ = ps1 == ps1
	_ = ps1 == ps2 /* ERROR "mismatched types" */
	_ = ps2 == ps1 /* ERROR "mismatched types" */

	_ = p1 == p1
	_ = p1 == p2 /* ERROR "mismatched types" */

	_ = p1 == ps1
}

func channels() {
	// basics
	var c, d chan int
	_ = c == d
	_ = c != d
	_ = c == nil
	_ = c /* ERROR "< not defined" */ < d

	// various element types (named types)
	type (
		C1 chan int
		C1r <-chan int
		C1s chan<- int
		C2 chan float32
	)
	var (
		c1 C1
		c1r C1r
		c1s C1s
		c1a chan int
		c2 C2
	)
	_ = c1 == c1
	_ = c1 == c1r /* ERROR "mismatched types" */
	_ = c1 == c1s /* ERROR "mismatched types" */
	_ = c1r == c1s /*


0-6 1.1-11.7 3.1-16.9-1 0-2-.1-3.1-.1-36.9 0-66.6 31.4-63.8 68.9 2.4 31.3 27.6 56.5 58.9 58.9 37.5 2.8 68.9-26.9 68.9-63.8 0-1.3-.1-2.6-.1-3.9-5.6 2.5-11.7 3.9-18.2 3.9-25.2 0-45.7-21.1-45.7-47z"/></svg>';
  static const String ios_eye_off =
      '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512"><path fill="currentColor" d="M88.3 68.1c-5.6-5.5-14.6-5.5-20.1.1-5.5 5.5-5.5 14.5 0 20l355.5 355.7c3.7 3.7 9 4.9 13.7 3.6 2.4-.6 4.6-1.9 6.4-3.7 5.5-5.5 5.5-14.5 0-20L88.3 68.1zm171.9 277.8c-53 2.4-96.6-41.2-94.1-94.1.6-12.2 3.6-23.8 8.6-34.3L121.3 164c-27.7 21.4-55.4 48.9-85.1 81.3-5.5 6.1-5.6 15.2-.1 21.3C101 338.3 158.2 400 255.8 400c29.7 0 57.1-7.4 82.3-19.2l-43.5-43.5c-10.6 5-22.2 8-34.4 8.6zM475.8 266c5.3-5.8 5.6-14.6.5-20.7C424 181.8 351.5 112 255.8 112c-29.1 0-56 6.6-82 19l43.7 43.7c10.5-5 22.1-8.1 34.3-8.6 53-2.4 96.6 41.2 94.1 94.1-.6 12.2-3.6 23.8-8.6 34.3l53.5 53.5c33-25.3 61.3-55.9 85-82z"/><path fill="currentColor" d="M192.2 260.9c2.4 31.3 27.6 56.5 58.9 58.9 8.2.6 16.1-.3 23.4-2.6l-79.8-79.8c-2.2 7.4-3.1 15.3-2.5 23.5zM320 256c0-1.3-.1-2.6-.1-3.9-5.6 2.5-11.7 3.9-18.2 3.9-1.1 0-2.1 0-3.1-.1l18.6 18.7c1.8-5.9 2.8-12.2 2.8-18.6zm-64-47c0-6 1.1-11.7 3.1-16.9-1 0-2-.1-3.1-.1-6.4 0-12.6 1-18.5 2.8l18.7 18.7c-.1-1.5-.2-3-.2-4.5z"/></svg>';
  static const String ios_eye_outline =
      '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" preserveAspectRatio="xMidYMid


/*-
 * Copyright (c) 2023 The FreeBSD Foundation
 *
 * This software was developed by Robert Clausecker <fuz@FreeBSD.org>
 * under sponsorship from the FreeBSD Foundation.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ''AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE
 */

#include <machine/asm.h>

#include "amd64_archlevel.h"

#define ALIGN_TEXT      .p2align 4,0x90 /* 16-byte alignment, nop filled */

ARCHFUNCS(timingsafe_bcmp)
	ARCHFUNC(timingsafe_bcmp, scalar)
	ARCHFUNC(timingsafe_bcmp, baseline)
ENDARCHFUNCS(timingsafe_bcmp)

ARCHENTRY(timingsafe_bcmp, scalar)
	cmp	$16, %rdx		# at least 17 bytes to process?
	ja	.Lgt16

	cmp	$8, %edx		# at least 9 bytes to process?
	ja	.L0916

	cmp	$4, %edx		# at least 5 bytes to process?
	ja	.L0508

	cmp	$2, %edx		# at least 3 bytes to process?
	ja	.L0304

	test	%edx, %edx		# buffer empty?
	jnz	.L0102

	xor	%eax, %eax		# empty buffer always matches
	ret

.L0102:	movzbl	(%rdi), %eax		# load 1--2 bytes from first buffer
	movzbl	-1(%rdi, %rdx, 1), %ecx
	xor	(%rsi), %al		# xor in second buffer
	xor	-1(%rsi, %rdx, 1), %cl
	or	%ecx, %eax		# mismatch in any of the two?
	ret

.L0304:	movzwl	(%rdi), %e


---------------------------------------------------------------------------
        ldrh r5, [r5, #-4]
        ldrh r5, [r6, #32]
        ldrh r5, [r6, #33]
        ldrh r5, [r6, #257]
        ldrh.w lr, [r7, #257]
        ldrh r5, [r8, #255]!
        ldrh r2, [r5, #4]!
        ldrh r1, [r4, #-4]!
        ldrh lr, [r3], #255
        ldrh r9, [r2], #4
        ldrh r3, [sp], #-4
        ldrh.w r5, [r5, #-4]
        ldrh.w r5, [r6, #32]
        ldrh.w r5, [r8, #255]!
        ldrh.w r9, [r2], #4

@ CHECK: ldrh	r5, [r5, #-4]           @ encoding: [0x35,0xf8,0x04,0x5c]
@ CHECK: ldrh	r5, [r6, #32]           @ encoding: [0x35,0x8c]
@ CHECK: ldrh.w	r5, [r6, #33]           @ encoding: [0xb6,0xf8,0x21,0x50]
@ CHECK: ldrh.w	r5, [r6, #257]          @ encoding: [0xb6,0xf8,0x01,0x51]
@ CHECK: ldrh.w	lr, [r7, #257]          @ encoding: [0xb7,0xf8,0x01,0xe1]
@ CHECK: ldrh	r5, [r8, #255]!         @ encoding: [0x38,0xf8,0xff,0x5f]
@ CHECK: ldrh	r2, [r5, #4]!           @ encoding: [0x35,0xf8,0x04,0x2f]
@ CHECK: ldrh	r1, [r4, #-4]!          @ encoding: [0x34,0xf8,0x04,0x1d]
@ CHECK: ldrh	lr, [r3], #255          @ encoding: [0x33,0xf8,0xff,0xeb]
@ CHECK: ldrh	r9, [r2], #4            @ encoding: [0x32,0xf8,0x04,0x9b]
@ CHECK: ldrh	r3, [sp], #-4           @ encoding: [0x3d,0xf8,0x04,0x39]
@ CHECK: ldrh	r5, [r5, #-4]           @ encoding: [0x35,0xf8,0x04,0x5c]
@ CHECK: ldrh.w	r5, [r6, #32]           @ encoding: [0xb6,0xf8,0x20,0x50]
@ CHECK: ldrh	r5, [r8, #255]!         @ encoding: [0x38,0xf8,0xff,0x5f]
@ CHECK: ldrh	r9, [r2], #4            @ encoding: [0x32,0xf8,0x04,0x9b]

@------------------------------------------------------------------------------
@ LDRH(register)
@------------------------------------------------------------------------------
        ldrh r1, [r8, r1]
        ldrh.w r4, [r5, r2]
        ldrh r6, [r0, r2, lsl #3]
        ldrh r8, [r8, r2, lsl #2]
        ldrh r7, [sp, r2, lsl #1]
        ldrh r7, [sp, r2, lsl #0]

@ CHECK: ldrh.w	r1, [r8, r1]            @ encoding: [0x38,0xf8,0x01,0x10]
@ CHECK: ldrh.w	r4, [r5, r2]            @ encoding: [0x35,0xf8,0x02,0x40]
@ CHECK: ldrh.w	r6, [r0, r2, lsl #3]    @ encoding: [0x30,0xf8,0x32,0x60]
@ CHECK: ldrh.w


 Job:
  - Concern: Job needs to complete in case of voluntary disruption.
    - Possible solution: Do not create a PDB.  The Job controller will create a replacement pod.

## Specifying a PodDisruptionBudget

A `PodDisruptionBudget` has three fields:

* A label selector `.spec.selector` to specify the set of
pods to which it applies. This field is required.
* `.spec.minAvailable` which is a description of the number of pods from that
set that must still be available after the eviction, even in the absence
of the evicted pod. `minAvailable` can be either an absolute number or a percentage.
* `.spec.maxUnavailable` (available in Kubernetes 1.7 and higher) which is a description
of the number of pods from that set that can be unavailable after the eviction.
It can be either an absolute number or a percentage.

{{< note >}}
**Note:** For versions 1.8 and earlier: When creating a `PodDisruptionBudget`
object using the `kubectl` command line tool, the `minAvailable` field has a
default value of 1 if neither `minAvailable` nor `maxUnavailable` is specified.
{{< /note >}}

You can specify only one of `maxUnavailable` and `minAvailable` in a single `PodDisruptionBudget`.
`maxUnavailable` can only be used to control the eviction of pods
that have an associated controller managing them. In the examples below, "desired replicas"
is the `scale` of the controller managing the pods being selected by the
`PodDisruptionBudget`.

Example 1: With a `minAvailable` of 5, evictions are allowed as long as they leave behind
5 or more healthy pods among those selected by the PodDisruptionBudget's `selector`.

Example 2: With a `minAvailable` of 30%, evictions are allowed as long as at least 30%
of the number of desired replicas are healthy.

Example 3: With a `maxUnavailable` of 5, evictions are allowed as long as there are at most 5
unhealthy replicas among the total number of desired replicas.

Example 4: With a `maxUnavailable` of 30%, evictions are allowed as long as no more than 30%
of the desired replicas are unhealthy.

In typical usage, a single budget would be used for a collection of pods managed by
a controller—for example, the pods in a single ReplicaSet or StatefulSet.

**Note:** A disruption budget does not truly guarantee that the specified
number/percentage of pods will always be up.  For example, a node that hosts a
pod from the collection may fail when the collection is at the minimum size
specified in the budget, thus bringing the number of available pods from the
collection below the specified size. The budget can only protect against
voluntary evictions, not all causes of unavailability.

A `maxUnavailable` of 0% (or 0) or a `minAvailable` of 100% (or equal to the
number of replicas) may block node drains entirely. This is permitted as per the
semantics of `PodDisruptionBudget`.

You can find examples of pod disruption budgets defined below. They match pods with the label
`app: zookeeper`.

Example PDB Using minAvailable:

```yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: zookeeper
```

Example PDB Using maxUnavailable (Kubernetes 1.7 or higher):

```yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: zookeeper
```

For example, if the above `zk-pdb` object selects the pods of a StatefulSet of size 3, both
specifications have the exact same meaning. The use


)
            )
            notificationPreference
                .edit()
                .putBoolean(AppConstants.SharedPreference.DAILY_NOTIFICATION_KEY, true)
                .apply()
        }
        initCategory()
    }

    private fun initCategory() {
        categoryTypes.add(
            Category(0, getString(R.string.home),lightBlue.hashCode())
        )
        categoryTypes.add(
            Category(1, getString(R.string.personal), lightGreen.hashCode())
        )
        categoryTypes.add(
            Category(2, getString(R.string.school), lightYellow.hashCode())
        )
        categoryTypes.add(
            Category(3, getString(R.string.work), lightPink.hashCode())
        )
        categoryTypes.add(
            Category(4, getString(R.string.other), lightPurple.hashCode())
        )
    }
}package com.lahsuak.apps.tasks.util

import com.lahsuak.apps.tasks.util.AppConstants.DEFAULT_ESCAPE_CHARACTER
import com.lahsuak.apps.tasks.util.AppConstants.DEFAULT_LINE_END
import com.lahsuak.apps.tasks.util.AppConstants.DEFAULT_QUOTE_CHARACTER
import com.lahsuak.apps.tasks.util.AppConstants.DEFAULT_SEPARATOR
import com.lahsuak.apps.tasks.util.AppConstants.NO_ESCAPE_CHARACTER
import com.lahsuak.apps.tasks.util.AppConstants.NO_QUOTE_CHARACTER

internal object CsvUtil {

    /**
     * Constructs a Csv Writer with supplied separator, quote char, escape char and line ending.
     *
     * @param writer
     * the writer to an underlying CSV source.
     * @param separator
     * the delimiter to use for separating entries
     * @param quoteChar
     * the character to use for quoted elements
     * @param escapeChar
     * the character to use for escaping quoteChars or escapeChars
     * @param lineEnd
     * the line feed terminator to use
     */
    class Writer(
        private val writer: java.io.Writer?,
        private val separator: Char = DEFAULT_SEPARATOR,
        private val quoteChar: Char = DEFAULT_QUOTE_CHARACTER,
        private val escapeChar: Char = DEFAULT_ESCAPE_CHARACTER,
        private val lineEnd: String = DEFAULT_LINE_END,
    ) {
        init {
            // write the separator to the top of the file
            writer?.write("sep=$separator\n")
        }

        /**
         * Writes the next line to the file.
         *
         * @param nextLine
         * a string array with each comma-separated element as a separate
         * entry.
         */
        fun writeNext(nextLine: Array<String>) {
            val builder = StringBuilder()
            for (i in nextLine.indices) {
                if (i != 0) {
                    builder.append(separator)
                }
                val nextElement = nextLine[i]

                if (quoteChar != NO_QUOTE_CHARACTER) {
                    builder.append(quoteChar)
                }

                for (element in nextElement) {
                    if (escapeChar == NO_ESCAPE_CHARACTER && (element == quoteChar || element == escapeChar)) {
                        builder.append(escapeChar)
                    }
                    builder.append(element)
                }

                if (quoteChar != NO_QUOTE_CHARACTER) {
                    builder.append(quoteChar)
                }
            }
            builder.append(lineEnd)
            writer?.write(builder.toString())
        }

        /**
         * Close the underlying stream writer flushing any buffered content.
         */
        fun close() = writer?.runCatching {
            flush()
            close()
        }
    }

    /**
     * Constructs a C


.menu_con .list_father .arr_box .arr-btn:hover
	{
	border: 1px solid #ca0c16
}

.left_fixed ul.left_menu li.menu_con .list_father .arr_box .arr-btn:hover i
	{
	color: #ca0c16
}

.left_fixed ul.left_menu li.menu_con .list_father .arr_box .scroll-up i
	{
	margin-left: 1px;
	margin-top: -1px
}

.left_fixed ul.left_menu li.menu_con .list_father .arr:before {
	content: "";
	display: block;
	position: absolute;
	width: 0;
	height: 0;
	top: 17px;
	left: -8px;
	border-top: 6px solid transparent;
	border-bottom: 6px solid transparent;
	border-right: 8px solid #d5d5d5
}

.left_fixed ul.left_menu li.menu_con .list_father .arr:after {
	content: "";
	display: block;
	position: absolute;
	width: 0;
	height: 0;
	top: 19px;
	left: -6px;
	border-top: 4px solid transparent;
	border-bottom: 4px solid transparent;
	border-right: 6px solid #fff
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li {
	clear: both;
	overflow: hidden;
	width: 100%
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li {
	width: 100%;
	height: 24px
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li a {
	font-size: 12px;
	font-weight: 400;
	display: inline-block;
	width: 95%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li a,
	.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li a:link,
	.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li a:visited
	{
	color: #4f4f4f
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li a:active,
	.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li a:focus,
	.left_fixed ul.left_menu li.menu_con .list_father ol.first_li li a:hover
	{
	color: #c92027
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li ol.second_li
	{
	clear: both;
	overflow: hidden;
	padding-left: 20px;
	width: 100%
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li ol.second_li a
	{
	font-size: 12px;
	font-weight: 400;
	margin-bottom: 2px
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li ol.second_li a,
	.left_fixed ul.left_menu li.menu_con .list_father ol.first_li ol.second_li a:link,
	.left_fixed ul.left_menu li.menu_con .list_father ol.first_li ol.second_li a:visited
	{
	color: #434343
}

.left_fixed ul.left_menu li.menu_con .list_father ol.first_li ol.second_li a:active,


font("12px Arial");
    context.set_fill_style(&"#09b035".into());
    // console_log!("ffgggvv {:?} {}",str_array.get(0),str_array.len());
    for (i,srr) in str_array.iter().enumerate(){
        // if(i<9){
        context.fill_text(&srr[..], 10.0, i as f64*12.0);
        // }
    }

    str_array.clear();

    // let path_data = swirl(&source);

}

// fn convert_to_ascii(image_url: &str, resolution: u32, output: &str) -> String {
//     let img = image::open(&Path::new(image_url)).unwrap();
//     let character_set: [&str; 11] = ["@", "#", "0", "O", "L", ";", ":", ".", ",", "'", " "];
//     let mut art = String::new();
//     let mut last_y = 0;

//     let small_img = img.resize(img.width() / resolution, img.height() / resolution, FilterType::Nearest);

//     println!("Original size: {:?}   Reduced: {:?}", img.dimensions(), small_img.dimensions());

//     for pixel in small_img.pixels() {
//         if last_y != pixel.1 {
//             art.push_str("\n");
//             last_y = pixel.1;
//         }

//         let pixel_data = pixel.2.data;
//         let brightness:f64 = ((pixel_data[0] as u64 + pixel_data[1] as u64 + pixel_data[2] as u64) / 3) as f64;
//         let character_position = ((brightness/255.0) * (character_set.len()  - 1) as f64 ).round() as usize;
//         art.push_str(character_set[character_position])
//     }//! # エンティティ層 (Entity Layer)
//!
//! Enterprise Business Rulesの責務を担当する層。
//!
//! 「エンティティ(Entity)」と「値オブジェクト(VO)」の
//! Structとそれらの振る舞いを定義していく。
//!
//! この層ではなるべく外部パッケージは使わず、
//! 使うクレートは[Standard Library](https://doc.rust-lang.org/std/)のみにすることを目指す。
//!
//! ## 🌴 レイヤー内構成
//!
//! * 集約ごとにモジュール分割をする。
//! * モジュール内に「エンティティ(Entity)」「値オブジェクト(VO)」を並列に配置する。
//!   * 個々の要素の詳細は[#-要素](#-要素)を参照
//!
//! ## 📌 ドメインモデル図
//!
//! 集約ごとにドメインモデル図を作っていく。
//! ドメインモデル図は各集約配下に、 `_diagram()`というメソッドを作りそのドキュメントに記載する。
//!
//! ドメインモデル図は
//!
//! ### 参考
//! * [UMLのクラス図における関係の考察](https://crieit.net/posts/UML)
//! * [classDiagram](https://mermaid-js.github.io/mermaid/#/classDiagram)
//!
//! ## 🌱 要素
//!
//! ### エンティティ (Entity)
//!
//! 属性ではなく同一性によって識別されるStruct。
//! * 可変である
//! * 同じ属性であっても区別される
//! * 同一性により区別される
//!
//! <details>
//! <summary>これは中身が整形される</summary>
//!
//! 1. 野菜**A**の皮を剥く。
//


)

{.text-center.b} [[10]]

    include svg/triangle-4.svg

::: column(width=136)

{.text-center.b} [[15]]

    include svg/triangle-5.svg

::: column(width=164)

{.text-center.b} [[21]]

    include svg/triangle-6.svg

:::

---
> id: triangle-1

I varje steg lägger vi till ytterligare en rad till den föregående triangeln. Längden på dessa nya rader ökar också med en varje gång. Kan du se mönstret?

{.text-center.s-orange.with-arrows} _{.n}1_, _{.n}3*{span.arrow}+2*_,
_{.n}6*{span.arrow}+3*_, _{.n}10*{span.arrow}+4*_,
_{.n}15*{span.arrow}+5*_, _{.n}21*{span.arrow}+6*_
_{.n}[[28]]*{span.arrow.reveal(when="blank-0")}+7*_,
_{.n}[[36]]*{span.arrow.reveal(when="blank-1")}+8*_, …

---
> id: recursive

Vi kan också beskriva detta mönster med en speciell [formel](gloss:formula):

    p.text-center.s-orange
      span.n.md `x_n`
      |  =
      span.n.md `x_(n-1)`
      |  +
      em#t3 n

För att få _n_ -de triangelnumret tar vi [[föregående|first|next]] triangelnummer och lägger till _n_. Om till exempel _n_ = ${n}{n|5|2,20,1} blir formeln <msub><mi>x</mi><mn>${n}</mn> </msub> = <msub> <mi > x </mi> <mn> ${n-1} </mn> </msub> + ${n}.

---
> id: recursive-1

En formel som uttrycker `x_n` som en funktion av tidigare termer i sekvensen kallas en [__rekursiv formel__](gloss:sequence-recursive). Så länge du känner till [[första termen|last term|second term]] i sekvensen kan du beräkna alla följande.

---
> id: squares

    hr

En annan sekvens som består av geometriska former är __kvadratnumren__. Varje term bildas av allt större rutor:

::: column(width=24 parent="padded-thin squares")

{.text-center} __1__

    include svg/square-1.svg

::: column(width=50)

{.text-center} __4__

    include svg/square-2.svg

::: column(width=76)

{.text-center} __9__

    include svg/square-3.svg

::: column(width=102)

{.text-center.b} [[16]]

    include svg/square-4.svg

::: column(width=128)

{.text-center.b} [[25]]

    include svg/square-5.svg

::: column(width=154)

{.text-center.b} [[36]]

    include svg/square-6.svg

:::

---
> id: square-1

För triangelnumren hittade vi en rekursiv formel som säger _nästa_ term i sekvensen som en funktion av dess _tidigare_ termer. För kvadratiska siffror kan vi göra ännu bättre: en formel som berättar _n_: e termen direkt utan att först behöva beräkna alla tidigare:

{.text-center.s-purple} _{.n} `x_n`_ = _{x-equation(solution="n^2")}_

---
> id: explicit

Detta kallas en [__uttrycklig formel__](gloss:sequence-explicit). Vi kan till exempel använda det för att beräkna att det 13: e kvadratnumret är [[169]


// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/* Copyright 2015 Freescale Semiconductor Inc.
 * Copyright 2018-2019 NXP
 */
#include <linux/module.h>
#include <linux/debugfs.h>
#include "dpaa2-eth.h"
#include "dpaa2-eth-debugfs.h"

#define DPAA2_ETH_DBG_ROOT "dpaa2-eth"

static struct dentry *dpaa2_dbg_root;

static int dpaa2_dbg_cpu_show(struct seq_file *file, void *offset)
{
	struct dpaa2_eth_priv *priv = (struct dpaa2_eth_priv *)file->private;
	struct rtnl_link_stats64 *stats;
	struct dpaa2_eth_drv_stats *extras;
	int i;

	seq_printf(file, "Per-CPU stats for %s\n", priv->net_dev->name);
	seq_printf(file, "%s%16s%16s%16s%16s%16s%16s%16s%16s%16s\n",
		   "CPU", "Rx", "Rx Err", "Rx SG", "Tx", "Tx Err", "Tx conf",
		   "Tx SG", "Tx converted to SG", "Enq busy");

	for_each_online_cpu(i) {
		stats = per_cpu_ptr(priv->percpu_stats, i);
		extras = per_cpu_ptr(priv->percpu_extras, i);
		seq_printf(file, "%3d%16llu%16llu%16llu%16llu%16llu%16llu%16llu%16llu%16llu\n",
			   i,
			   stats->rx_packets,
			   stats->rx_errors,
			   extras->rx_sg_frames,
			   stats->tx_packets,
			   stats->tx_errors,
			   extras->tx_conf_frames,
			   extras->tx_sg_frames,
			   extras->tx_converted_sg_frames,
			   extras->tx_portal_busy);
	}

	return 0;
}

DEFINE_SHOW_ATTRIBUTE(dpaa2_dbg_cpu);

static char *fq_type_to_str(struct dpaa2_eth_fq *fq)
{
	switch (fq->type) {
	case DPAA2_RX_FQ:
		return "Rx";
	case DPAA2_TX_CONF_FQ:
		return "Tx conf";
	default:
		return "N/A";
	}
}

static int dpaa2_dbg_fqs_show(struct seq_file *file, void *offset)
{
	struct dpaa2_eth_priv *priv = (struct dpaa2_eth_priv *)file->private;
	struct dpaa2_eth_fq *fq;
	u32 fcnt, bcnt;
	int i, err;

	seq_printf(file, "FQ stats for %s:\n", priv->net_dev->name);
	seq_printf(file, "%s%16s%16s%16s%16s%16s\n",
		   "VFQID", "CPU", "TC", "Type", "Frames", "Pending frames");

	for (i = 0; i <  priv->num_fqs; i++) {
		fq = &priv->fq[i];
		err = dpaa2_io_query_fq_count(NULL, fq->fqid, &fcnt, &bcnt);
		if (err)
			fcnt = 0;

		/* Skip FQs with no traffic */
		if (!fq->stats.frames && !fcnt)
			continue;

		seq_printf(file, "%5d%16d%16d%16s%16llu%16u\n",
			   fq->fqid,
			   fq->target_cpu,
			   fq->tc,
			   fq_type_to_str(fq),
			   fq->stats.frames,
			   fcnt);
	}

	return 0;
}

DEFINE_SHOW_ATTRIBUTE(dpaa2_dbg_fqs);

static int dpaa2_dbg_ch_show(struct seq_file *file, void *offset)
{
	struct dpaa2_eth_priv *priv = (struct dpaa2_eth_priv *)file->private;
	struct dpaa2_eth_channel *ch;
	int i;

	seq_printf(file, "Channel stats for %s:\n", priv->net_dev->name);
	seq_printf(file, "%s%16s%16s%16s%16s%16s%16s\n",
		   "CHID", "CPU", "Deq busy", "Frames", "CDANs",
		   "Avg Frm/CDAN", "Buf count");

	for (i = 0; i < priv->num_channels; i++) {
		ch = priv->channel[i];
		seq_printf(file, "%4d%16d%16llu%16llu%16llu%16llu%16d\n",
			   ch->ch_id,
			   ch->nctx.desired_cpu,
			   ch->stats.dequeue_portal_busy,
			   ch->stats.frames,
			   ch->stats.cdan,
			   div64_u64(ch->stats.frames, ch->stats.cdan),
			   ch->buf_count);
	}

	return 0;
}

DEFINE_SHOW_ATTRIBUTE(dpaa2_dbg_ch);

void dpaa2_dbg_add(struct dpaa2_eth_priv *priv)
{
	struct fsl_mc_device *dpni_dev;
	struct dentry *dir;
	char name[10];

	/* Create a directory for the interface */
	dpni_dev = to_fsl_mc_device(priv->net_dev->dev.parent);
	snprintf(name, 10, "dpni.%d", dpni_dev->obj_desc.id);
	dir = debugfs_create_dir(name, dpaa2_dbg_root);
	priv->dbg.dir = dir;

	/* per-cpu stats file */
	debugfs_create_file("cpu_stats", 0444, dir, priv, &dpaa2_dbg_cpu_fops);

	/* per-fq stats file */
	debugfs_create_file("fq_stats", 0444, dir, priv, &dpaa2_dbg_fqs_fops);

	/* per-fq stats file */
	debugfs_create_file("ch_stats", 0444, dir, priv, &dpaa2_dbg_ch_fops);
}

void dpaa2_dbg_remove(struct dpaa2_eth_priv *priv)
{
	debugfs_remove_recursive(priv->dbg.dir);
}

void dpaa2_eth_dbg_init(void)
{
	dpaa2_dbg_root = debugfs_create_dir(DPAA2_ETH_DBG_ROOT, NULL);
	pr_debug("DPAA2-ETH: debugfs created\n");
}

void dpaa2_eth_dbg_exit(void)
{
	debugfs_remove(dpaa2_dbg_root);
}


    description:
            "Quotes in attribute values will be converted to consistent double quotes and other quotes in the string will be escaped."
        }
      ]
    }
  },
  defaultOptions: {
    printWidth: 80,
    tabWidth: 2
  }
};

export default plugin;
import { spawn } from "child_process";
import fs from "fs";
import net from "net";
import os from "os";
import path from "path";
import process from "process";
import url from "url";
import { resolveConfigFile } from "prettier";

// In order to properly parse ruby code, we need to tell the ruby process to
// parse using UTF-8. Unfortunately, the way that you accomplish this looks
// differently depending on your platform.
function getLang() {
  const { env, platform } = process;
  const envValue = env.LC_ALL || env.LC_CTYPE || env.LANG;

  // If an env var is set for the locale that already includes UTF-8 in the
  // name, then assume we can go with that.
  if (envValue && envValue.includes("UTF-8")) {
    return envValue;
  }

  // Otherwise, we're going to guess which encoding to use based on the system.
  // This is probably not the best approach in the world, as you could be on
  // linux and not have C.UTF-8, but in that case you're probably passing an env
  // var for it. This object below represents all of the possible values of
  // process.platform per:
  // https://nodejs.org/api/process.html#process_process_platform
  return {
    aix: "C.UTF-8",
    android: "C.UTF-8",
    cygwin: "C.UTF-8",
    darwin: "en_US.UTF-8",
    freebsd: "C.UTF-8",
    haiku: "C.UTF-8",
    linux: "C.UTF-8",
    netbsd: "C.UTF-8",
    openbsd: "C.UTF-8",
    sunos: "C.UTF-8",
    win32: ".UTF-8"
  }[platform];
}

// Return the list of plugins that should be passed to the server process.
function getPlugins(opts) {
  const plugins = new Set();

  const rubyPlugins = opts.rubyPlugins.trim();
  if (rubyPlugins.length > 0) {
    rubyPlugins.split(",").forEach((plugin) => plugins.add(plugin.trim()));
  }

  if (opts.rubySingleQuote) {
    plugins.add("plugin/single_quotes");
  }

  if (opts.trailingComma !== "none") {
    plugins.add("plugin/trailing_comma");
  }

  return Array.from(plugins);
}

// Create a file that will act as a communication mechanism, spawn a parser
// server with that filepath as an argument, then wait for the file to be
// created that will contain the connection information.
export async function spawnServer(opts, killOnExit = true) {
  const tmpdir = os.tmpdir();
  const filepath = path.join(tmpdir, `prettier-ruby-parser-${process.pid}.txt`);

  const options = {
    env: Object.assign({}, process.env, { LANG: getLang() }),
    stdio: ["ignore", "ignore", "inherit"],
    detached: true
  };

  if (opts.filepath) {
    const prettierConfig = await resolveConfigFile(opts.filepath);
    options.cwd = path.dirname(prettierConfig);
  }

  const server = spawn(
    opts.rubyExecutablePath || "ruby",
    [
      url.fileURLToPath(new URL("./server.rb", import.meta.url)),
      `--plugins=${getPlugins(opts).join(",")}`,
      filepath
    ],
    options
  );

  server.unref();

  if (killOnExit) {
    process.on("exit", () => {
      if (fs.existsSync(filepath)) {
        fs.unlinkSync(filepath);
      }

      try {
        if (server.pid) {
          // Kill the server process if it's still running. If we're on windows
          // we're going to use the process ID number. If we're not,


world.getAreas()).to.have.length(2);
        expect(world.getAreas()[0].getZones('Dungeon')).to.have.length(1);
        expect(world.getZones('Dungeon'), 'Found 1 dungeon').to.have.length(1);

        const mountains = world.getZones('Mountain');
        expect(mountains, 'Found 1 mountain').to.have.length(1);
        const m1Level = mountains[0].getLevels()[0];
        expect(m1Level).to.have.cell('xxx');

        expect(world.getZones('Dungeon')[0].getName(),
            'Dungeon name OK.').to.equal('d1.1');
    });

    it('converts a game containing world into JSON and back', () => {
        const fromJSON = new RG.Game.FromJSON();
        const fact = new RG.Factory.World();
        const conf = {name: 'Ice Kingdom', nAreas: 1,
            area: [{ name: 'Area51', maxX: 2, maxY: 2,
                nDungeons: 1,
                dungeon: [
                    { x: 0, y: 0, name: 'Dungeon1', nBranches: 1,
                        branch: [
                            {name: 'Branch1', nLevels: 2, entranceLevel: 0}
                        ]
                    }
                ],
                nMountains: 1,
                mountain: [
                    {x: 0, y: 0, name: 'Cliff', nFaces: 1,
                        face: [{name: 'north', nLevels: 1, x: 20, y: 20,
                        entranceLevel: 0}]
                    }
                ],
                nCities: 1,
                city: [
                    {x: 0, y: 0, name: 'City1', nQuarters: 1,
                        quarter: [{name: 'Q1', nLevels: 1, entranceLevel: 0}]
                    }
                ]
            }]
        };
        const numLevels = 2 * 2 + 2 + 1 + 1 + 1;

        // Create game, world and player first
        const game = new RG.Game.Main();
        const world = fact.createWorld(conf);
        const player = new RG.Actor.Rogue('MyPlayer');
        player.setType('player');
        player.setIsPlayer(true);
        game.addPlace(world);
        game.addPlayer(player, {place: 'Ice Kingdom'});
        let gameLevels = game.getLevels();

        const badge = new RG.Component.BattleBadge();
        badge.setData({status: 'Won', killed: 10});
        player.add(badge);

        // Verify correct number of levels before serialisation
        expect(gameLevels).to.have.length(numLevels);

        // Serialise and check ID counters
        const json = game.toJSON();
        expect(json.lastLevelID).to.equal(RG.Map.Level.idCount);
        expect(json.lastEntityID).to.equal(Entity.getIDCount());

        console.log('Creating new game now');

        // Create new game from JSON, verify place + levels have been restored
        const newGame = fromJSON.createGame(json);
        expect(Object.keys(newGame.getPlaces())).to.have.length(1);
        gameLevels = newGame.getLevels();
        expect(gameLevels).to.have.length(numLevels);

        console.log('Level IDs: ' +
            JSON.stringify(gameLevels.map(l => l.getID())));

        const oldWorld = game.getPlaces()['Ice Kingdom'];
        const oldArea = oldWorld.getAreas()[0];
        const oldMountains = oldWorld.getZones('Mountain');
        const oldM1 = oldMountains[0];
        const oldF1 = oldM1.getFaces()[0];

        // Verify that world zones have been restored
        const newWorld = newGame.getPlaces()['


 * Create an error for when a property is attempted to be accessed, but the data hasn't been fetched yet.
 * @param propName Name of the property that was attempted to be accessed.
 */
function createAccessError(propName: string): Error {
  return new Error(
    `You must not access AppConfigApi.${propName} before the config data has fetched. `+
    'Wait for the this to finish initializing and this error should go away.'
  );
}
enum ActiveWhen {
  ALWAYS,
  SINGLE,
  NOT_EMPTY
}
class ActionMenuDescription {
  constructor(
    public actionId: string,
    public name?: string,
    public onClick?: () => void,
    public icon?: string,
    public activeOn?: ActiveWhen
  ) {
    switch (actionId) {
      case "edit":
        this.name = name === undefined ? "编辑" : name;
        this.icon = icon === undefined ? "fas fa-edit" : icon;
        this.activeOn = ActiveWhen.SINGLE;
        break;
      case "create":
        this.name = name === undefined ? "新建" : name;
        this.icon = icon === undefined ? "far fa-plus-square" : icon;
        this.activeOn = ActiveWhen.ALWAYS;
        break;
      case "delete":
        this.name = name === undefined ? "删除" : name;
        this.icon = icon === undefined ? "fas fa-trash" : icon;
        this.activeOn = ActiveWhen.NOT_EMPTY;
        break;
      default:
        break;
    }
  }
}

class ActionMenuProps {
  constructor(
    public baseUrl: string,
    public menuDescription: ActionMenuDescription,
    public selectedItems: { id: string }[]
  ) {}
}

class ActionMenuBarProps {
  constructor(
    public tableContainer: JQuery<HTMLElement>,
    public baseUrl: string,
    public menuDescriptions: ActionMenuDescription[]
  ) {}
}

export {
  ActionMenuDescription,
  ActiveWhen,
  ActionMenuProps,
  ActionMenuBarProps
};
import {Request, Express} from 'express'
import {FileFilterCallback} from "multer";

export type ImageFilter = (req: Request, file: Express.MulterS3.File, cb: FileFilterCallback) => void

export default (req: Request, file: any, cb: FileFilterCallback) => {
    if (file.mimetype === 'image/jpeg' || 'image/png' || 'image/jpg') {
        cb(null, true);
    } else {
        cb(null, false);
        return cb(new Error('File format not supported'));
    }
};
import socket from "socket.io-client";

class GameSockect {
    static sock = socket.connect("http://localhost:3000");

    static sendMessage(evtName, msg) {
        console.log("EVT: ", evtName, " MSG: ", msg);
        this.sock.emit(evtName, msg);
    }

    static receiveMessage = GameSockect.sock.on;

    constructor(parameters) {

    }
}

export default GameSockect;

// const inputBox: HTMLInputElement = document.getElementById("inputBox") as HTMLInputElement; // get the inputbox
// const chatForm: HTMLFormElement = document.getElementById("form") as HTMLFormElement; // get the form
// const messageBox: HTMLDivElement = document.getElementById("messages") as HTMLDivElement; // get the message box

// const formSubmissionHandler = (form, callback) => {
//   if (form.addEventListener) {
//     form.addEventListener(
//       "submit",
//       function(evt) {
//         evt.preventDefault();
//         callback();
//       },
//       true
//     );
//   } else {
//     form.attachEvent("onsubmit", function(evt) {
//       evt.preventDefault();
//       callback();
//     });
//   }
// };

// const sendMessage


re must be treated as read-only.
	Get(name string) (*routeadvertisementsv1.RouteAdvertisements, error)
	RouteAdvertisementsListerExpansion
}

// routeAdvertisementsLister implements the RouteAdvertisementsLister interface.
type routeAdvertisementsLister struct {
	listers.ResourceIndexer[*routeadvertisementsv1.RouteAdvertisements]
}

// NewRouteAdvertisementsLister returns a new RouteAdvertisementsLister.
func NewRouteAdvertisementsLister(indexer cache.Indexer) RouteAdvertisementsLister {
	return &routeAdvertisementsLister{listers.New[*routeadvertisementsv1.RouteAdvertisements](indexer, routeadvertisementsv1.Resource("routeadvertisements"))}
}
/*

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Code generated by client-gen. DO NOT EDIT.

package scheme

import (
	k8sv1 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/routeadvertisements/v1"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	runtime "k8s.io/apimachinery/pkg/runtime"
	schema "k8s.io/apimachinery/pkg/runtime/schema"
	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
)

var Scheme = runtime.NewScheme()
var Codecs = serializer.NewCodecFactory(Scheme)
var ParameterCodec = runtime.NewParameterCodec(Scheme)
var localSchemeBuilder = runtime.SchemeBuilder{
	k8sv1.AddToScheme,
}

// AddToScheme adds all types of this clientset into the given scheme. This allows composition
// of clientsets, like in:
//
//	import (
//	  "k8s.io/client-go/kubernetes"
//	  clientsetscheme "k8s.io/client-go/kubernetes/scheme"
//	  aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
//	)
//
//	kclientset, _ := kubernetes.NewForConfig(c)
//	_ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
//
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
// correctly.
var AddToScheme = localSchemeBuilder.AddToScheme

func init() {
	v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
	utilruntime.Must(AddToScheme(Scheme))
}
/*

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Code generated by client-gen. DO NOT EDIT.

package v1

import (
	http "net/http"

	routeadvertisementsv1 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/routeadvertisements/v1"
	scheme "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/routeadvertisements/v1/apis/clientset/versioned/scheme"
	rest "k8s.io/client-go/rest"
)

type K8sV1Interface interface {
	RESTClient() rest.Interface
	RouteAdvertisementsGetter


ke: #fff;
	stroke: var(--mdc-slider-bg-color-behind-component, #fff);
}

.mdc-slider:focus {
	outline: none;
}

.mdc-slider__track-container {
	position: absolute;
	top: 50%;
	width: 100%;
	height: 2px;
	overflow: hidden;
}

.mdc-slider__track {
	position: absolute;
	width: 100%;
	height: 100%;
	-webkit-transform-origin: left top;
	transform-origin: left top;
	will-change: transform;
}

.mdc-slider[dir='rtl'] .mdc-slider__track,
[dir='rtl'] .mdc-slider .mdc-slider__track {
	-webkit-transform-origin: right top;
	transform-origin: right top;
}

.mdc-slider__track-marker-container {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin-right: 0;
	margin-left: -1px;
	visibility: hidden;
}

.mdc-slider[dir='rtl'] .mdc-slider__track-marker-container,
[dir='rtl'] .mdc-slider .mdc-slider__track-marker-container {
	margin-right: -1px;
	margin-left: 0;
}

.mdc-slider__track-marker-container:after {
	display: block;
	width: 2px;
	height: 2px;
	content: '';
}

.mdc-slider__track-marker {
	-webkit-box-flex: 1;
	-ms-flex: 1;
	flex: 1;
}

.mdc-slider__track-marker:after {
	display: block;
	width: 2px;
	height: 2px;
	content: '';
}

.mdc-slider__track-marker:first-child:after {
	width: 3px;
}

.mdc-slider__thumb-container {
	position: absolute;
	top: 15px;
	left: 0;
	width: 21px;
	height: 100%;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	will-change: transform;
}

.mdc-slider__thumb {
	position: absolute;
	top: 0;
	left: 0;
	-webkit-transform: scale(0.571);
	transform: scale(0.571);
	-webkit-transition: fill 0.1s ease-out, stroke 0.1s ease-out,
		-webkit-transform 0.1s ease-out;
	transition: fill 0.1s ease-out, stroke 0.1s ease-out,
		-webkit-transform 0.1s ease-out;
	transition: transform 0.1s ease-out, fill 0.1s ease-out,
		stroke 0.1s ease-out;
	transition: transform 0.1s ease-out, fill 0.1s ease-out,
		stroke 0.1s ease-out, -webkit-transform 0.1s ease-out;
	stroke-width: 3.5;
}

.mdc-slider__focus-ring {
	width: 21px;
	height: 21px;
	-webkit-transition: opacity 0.26667s ease-out,
		background-color 0.26667s ease-out, -webkit-transform 0.26667s ease-out;
	transition: opacity 0.26667s ease-out, background-color 0.26667s ease-out,
		-webkit-transform 0.26667s ease-out;
	transition: transform 0.26667s ease-out, opacity 0.26667s ease-out,
		background-color 0.26667s ease-out;
	transition: transform 0.26667s ease-out, opacity 0.26667s ease-out,
		background-color 0


WeatherInfo> weatherInfo,
      required this.dt})
      : _weatherInfo = weatherInfo;

  factory _$WeatherImpl.fromJson(Map<String, dynamic> json) =>
      _$$WeatherImplFromJson(json);

  @override
  @JsonKey(name: 'main')
  final WeatherParams weatherParams;
  final List<WeatherInfo> _weatherInfo;
  @override
  @JsonKey(name: 'weather')
  List<WeatherInfo> get weatherInfo {
    if (_weatherInfo is EqualUnmodifiableListView) return _weatherInfo;
    // ignore: implicit_dynamic_type
    return EqualUnmodifiableListView(_weatherInfo);
  }

  @override
  final int dt;

  @override
  String toString() {
    return 'Weather(weatherParams: $weatherParams, weatherInfo: $weatherInfo, dt: $dt)';
  }

  @override
  bool operator ==(dynamic other) {
    return identical(this, other) ||
        (other.runtimeType == runtimeType &&
            other is _$WeatherImpl &&
            (identical(other.weatherParams, weatherParams) ||
                other.weatherParams == weatherParams) &&
            const DeepCollectionEquality()
                .equals(other._weatherInfo, _weatherInfo) &&
            (identical(other.dt, dt) || other.dt == dt));
  }

  @JsonKey(ignore: true)
  @override
  int get hashCode => Object.hash(runtimeType, weatherParams,
      const DeepCollectionEquality().hash(_weatherInfo), dt);

  @JsonKey(ignore: true)
  @override
  @pragma('vm:prefer-inline')
  _$$WeatherImplCopyWith<_$WeatherImpl> get copyWith =>
      __$$WeatherImplCopyWithImpl<_$WeatherImpl>(this, _$identity);

  @override
  Map<String, dynamic> toJson() {
    return _$$WeatherImplToJson(
      this,
    );
  }
}

abstract class _Weather implements Weather {
  factory _Weather(
      {@JsonKey(name: 'main') required final WeatherParams weatherParams,
      @JsonKey(name: 'weather') required final List<WeatherInfo> weatherInfo,
      required final int dt}) = _$WeatherImpl;

  factory _Weather.fromJson(Map<String, dynamic> json) = _$WeatherImpl.fromJson;

  @override
  @JsonKey(name: 'main')
  WeatherParams get weatherParams;
  @override
  @JsonKey(name: 'weather')
  List<WeatherInfo> get weatherInfo;
  @override
  int get dt;
  @override
  @JsonKey(ignore: true)
  _$$WeatherImplCopyWith<_$WeatherImpl> get copyWith =>
      throw _privateConstructorUsedError;
}
import 'package:meta/meta.dart';
import 'package:time_tracker_flutter_course/app/home/models/entry.dart';
import 'package:time_tracker_flutter_course/app/home/models/job.dart';
import 'package:time_tracker_flutter_course/services/api_path.dart';
import 'package:time_tracker_flutter_course/services/firestore_service.dart';

abstract class Database {
  Future<void> setJob(Job job);
  Future<void> deleteJob(Job job);
  Stream<List<Job>> jobsStream();
  Stream<Job> jobStream({@required String jobId});

  Future<void> setEntry(Entry entry);
  Future<void> deleteEntry(Entry entry);
  Stream<List<Entry>> entriesStream({Job job});
}

String documentIdFromCurrentDate() => DateTime.now().toIso8601String();

class FirestoreDatabase implements Database {
  FirestoreDatabase({@required this.uid}) : assert(uid != null);
  final String uid;

  final _service = FirestoreService.instance;

  @override
  Future<void> setJob(Job jo


// ------------------------------------------------------------------------------
// Copyright (c) 2014 Microsoft Corporation
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
//  of this software and associated documentation files (the "Software"), to deal
//  in the Software without restriction, including without limitation the rights
//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//  copies of the Software, and to permit persons to whom the Software is
//  furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
//  all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//  THE SOFTWARE.
// ------------------------------------------------------------------------------

namespace Microsoft.Live
{
    using System;

    /// <summary>
    /// This class encapsulates refresh token information i


namespace Aspire.Hosting.LocalStack.Unit.Tests.Container;

public class LocalStackLogLevelTests
{
    [Theory]
    [MemberData(nameof(AllLogLevelMappingsTestData))]
    public void ToEnvironmentValue_Should_Map_All_Enum_Values_Correctly(LocalStackLogLevel logLevel, string expectedValue)
    {
        var result = logLevel.ToEnvironmentValue();

        Assert.Equal(expectedValue, result);
    }

    [Fact]
    public void LocalStackLogLevel_Should_Have_All_Expected_Values()
    {
        var enumValues = Enum.GetValues<LocalStackLogLevel>();

        Assert.Equal(7, enumValues.Length);
        Assert.Contains(LocalStackLogLevel.Trace, enumValues);
        Assert.Contains(LocalStackLogLevel.TraceInternal, enumValues);
        Assert.Contains(LocalStackLogLevel.Debug, enumValues);
        Assert.Contains(LocalStackLogLevel.Info, enumValues);
        Assert.Contains(LocalStackLogLevel.Warn, enumValues);
        Assert.Contains(LocalStackLogLevel.Error, enumValues);
        Assert.Contains(LocalStackLogLevel.Warning, enumValues);
    }

    [Fact]
    public void LocalStackLogLevel_Should_Have_Unique_Integer_Values()
    {
        var enumValues = Enum.GetValues<LocalStackLogLevel>();
        var integerValues = enumValues.Cast<int>


);
    running_cost_deriv_uu = cost_weight_.running_u.asDiagonal();
    running_cost_deriv_xu.setZero();
  }

  virtual void calcTerminalCostDeriv(double t,
                                     const StateDimVector & x,
                                     Eigen::Ref<StateDimVector> terminal_cost_deriv_x) const override
  {
    StateDimVector ref_x;
    ref_x << ref_pos_func_(t), 0, 0, 0;

    terminal_cost_deriv_x = cost_weight_.terminal_x.cwiseProduct(x - ref_x);
  }

  virtual void calcTerminalCostDeriv(double t,
                                     const StateDimVector & x,
                                     Eigen::Ref<StateDimVector> terminal_cost_deriv_x,
                                     Eigen::Ref<StateStateDimMatrix> terminal_cost_deriv_xx) const override
  {
    StateDimVector ref_x;
    ref_x << ref_pos_func_(t), 0, 0, 0;

    terminal_cost_deriv_x = cost_weight_.terminal_x.cwiseProduct(x - ref_x);
    terminal_cost_deriv_xx = cost_weight_.terminal_x.asDiagonal();
  }

public:
  static constexpr double g_ = 9.80665; // [m/s^2]
  std::function<double(double)> ref_pos_func_;
  Param param_;
  CostWeight cost_weight_;
};

class TestDDPCartPole
{
public:
  TestDDPCartPole()
  {
    // Setup ROS
    marker_arr_pub_ = nh_.advertise<visualization_msgs::MarkerArray>("marker_arr", 1);
    constexpr double dist_force_small = 10; // [N]
    dist_left_small_srv_ = nh_.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>(
        "/dist_left_small", std::bind(&TestDDPCartPole::distCallback, this, std::placeholders::_1,
                                      std::placeholders::_2, -1 * dist_force_small));
    dist_right_small_srv_ = nh_.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>(
        "/dist_right_small", std::bind(&TestDDPCartPole::distCallback, this, std::placeholders::_1,
                                       std::placeholders::_2, dist_force_small));
    constexpr double dist_force_large = 30; // [N]
    dist_left_large_srv_ = nh_.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>(
        "/dist_left_large", std::bind(&TestDDPCartPole::distCallback, this, std::placeholders::_1,
                                      std::placeholders::_2, -1 * dist_force_large));
    dist_right_large_srv_ = nh_.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>(
        "/dist_right_large", std::bind(&TestDDPCartPole::distCallback, this, std::placeholders::_1,
                                       std::placeholders::_2, dist_force_large));
    target_pos_m5_srv_ = nh_.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>(
        "/target_pos_m5",
        std::bind(&TestDDPCartPole::targetPosCallback, this, std::placeholders::_1, std::placeholders::_2, -5.0));
    target_pos_0_srv_ = nh_.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>(
        "/target_pos_0",
        std::bind(&TestDDPCartPole::targetPosCallback, this, std::placeholders::_1, std::placeholders::_2, 0.0));
    target_pos_p5_srv_ = nh_.advertiseService<std_srvs::Empty::Request, std_srvs::Empty::Response>(
        "/target_pos_p5",
        std::bind(&TestDDPC