LoginSignup
1
1

More than 3 years have passed since last update.

トライ木

Last updated at Posted at 2019-06-13

トライ木

  • ハッシュテーブルで探索しようとした時の発想に似ている.
  • 比較に基づいて位置を探索していくと最も効率よくて$O(\log n)$
  • だが,値そのものが位置に直接関係しているように,要するに値と位置が一対一に対応していれば,$O(1)$で探索ができる
  • この発想を「列」に対して適用したのがハッシュテーブルで,配列でもリストでも実装できてそれぞれハッシュ値の衝突時の解決策が異なってオープンアドレス法とチェイン法
  • では,「値と位置が一対一に対応」を木に適用しようとしたらどうなるか...
  • それがトライ木

  • キーの値自体でどの枝を降りればいいかが決定するような木構造
    • 英語なら各ノードは最大で26個の子供を持つことになる
  • トライ木を用いることで,$k$文字の英単語を検索すると,検索しようとする単語の個数によらず$O(k)$で探索できることになる
  • ただし,記憶領域を無駄に使う
  • ウェブサーバーのルーティングに使うとか応用ができそうだぞ
package main

import "log"

type Node struct {
    Children map[rune]*Node
    isEndOfWord bool
}

func NewNode() *Node {
    return &Node{Children:make(map[rune]*Node), isEndOfWord:false}
}

type Trie struct {
    Root *Node
}

func NewTrie() *Trie {
    return &Trie{Root: NewNode()}
}

func (t *Trie) Put(key string) {
    pCrawl := t.Root
    length := len(key)
    runes := []rune(key)
    for i := 0; i < length; i++ {
        if pCrawl.Children[runes[i]] == nil {
            pCrawl.Children[runes[i]] = NewNode()
        }
        pCrawl = pCrawl.Children[runes[i]]
    }
    pCrawl.isEndOfWord = true
}

func (t *Trie) Search(key string) bool {
    pCrawl := t.Root
    length := len(key)
    runes := []rune(key)
    for i := 0; i < length; i++ {
        if pCrawl.Children[runes[i]] == nil {
            return false
        }
        pCrawl = pCrawl.Children[runes[i]]
    }
    return pCrawl != nil && pCrawl.isEndOfWord
}

func main() {
    keys := []string{"the","a","there","anaswe","any","by","their"}
    t := NewTrie()
    for _, key := range keys {
        t.Put(key)
    }
    log.Printf("%#v\n", t)
    targets := []string{"the", "these", "their", "thaw", "a"}
    for _, target := range targets {
        if t.Search(target) {
            log.Println("Found!")
        } else {
            log.Println("Not Found!")
        }
    }
}
package main

import (
    "bufio"
    "errors"
    "log"
    "os"
)

type Trie struct {
    Value interface{}
    Children map[rune]*Trie
}

func (t *Trie) Search(key string) interface{} {
    node := t
    for _, r := range key {
        node = node.Children[r]
        if node == nil {
            return nil // no value are stored with the given key
        }
    }
    return node.Value
}

func (t *Trie) Put(key string, value interface{}) {
    node := t
    for _, r := range key {
        child, _ := node.Children[r]
        if child == nil {
            child = NewTrie()
            node.Children[r] = child
        }
        node = child
    }
    isNewValue := node.Value == nil
    if isNewValue {
        log.Printf("Put: new value <%#v> was put with key <%s>\n", value, key)
        node.Value = value
    } else {
        log.Printf("Update: <%#v> ==> <%#v> with key <%s>\n", node.Value, value, key)
        node.Value = value
    }
}

func (t *Trie) Delete(key string) error {
    path := make([]PathRecord, len(key))
    node := t
    for i, r := range key {
        path[i] = PathRecord{node: node, r:r}
        node = node.Children[r]
        if node == nil {
            return errors.New("no node for such key")
        }
    }
    deleted := node.Value
    node.Value = nil
    if node.isLeaf() {
        for i := len(key)-1; i >= 0; i-- {
            parent := path[i].node
            r := path[i].r
            delete(parent.Children, r)
            if parent.Value != nil || !parent.isLeaf() {
                break
            }
        }
    }
    log.Printf("Delete: <key: %s, value: %#v>\n", key, deleted)
    return nil
}

func (t *Trie) isLeaf() bool {
    return len(t.Children) == 0
}

func NewTrie() *Trie {
    return &Trie{Children:make(map[rune]*Trie)}
}

type PathRecord struct {
    node *Trie
    r rune
}

func prepare(fileName string) []string {
    ret := make([]string, 0)
    file, err := os.Open(fileName)
    if err != nil {
        log.Fatalln("Can not open file")
    }
    defer file.Close()
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        ret = append(ret, scanner.Text())
    }
    if err = scanner.Err(); err != nil {
        log.Fatalln("Can not read file right")
    }
    return ret
}

func main() {
    t := NewTrie()
    keys := prepare("keys")
    values := prepare("values")
    for i := 0; i < 2000; i++ {
        t.Put(keys[i], values[i])
    }
    for i := 0; i < 2000; i++ {
        if t.Search(keys[i]) == nil {
            log.Printf("Not Found! <key: %s>\n", keys[i])
        } else {
            log.Printf("Found! <key: %s, value: %#v>\n", keys[i], t.Search(keys[i]))
        }
    }
    for i := 500; i < 1500; i++ {
        err := t.Delete(keys[i])
        if err != nil {
            log.Fatalf("Error: Fail to delete <key: %s>\n", keys[i])
        }
    }
    for i := 0; i < 2000; i++ {
        if t.Search(keys[i]) == nil {
            log.Printf("Not Found! <key: %s>\n", keys[i])
        } else {
            log.Printf("Found! <key: %s, value: %#v>\n", keys[i], t.Search(keys[i]))
        }
    }
}
// keys
a
ability
able
about
above
accept
according
account
across
act
action
activity
actually
add
address
administration
admit
adult
affect
after
again
against
age
agency
agent
ago
agree
agreement
ahead
air
all
allow
almost
alone
along
already
also
although
always
American
among
amount
analysis
and
animal
another
answer
any
anyone
anything
appear
apply
approach
area
argue
arm
around
arrive
art
article
artist
as
ask
assume
at
attack
attention
attorney
audience
author
authority
available
avoid
away
baby
back
bad
bag
ball
bank
bar
base
be
beat
beautiful
because
become
bed
before
begin
behavior
behind
believe
benefit
best
better
between
beyond
big
bill
billion
bit
black
blood
blue
board
body
book
born
both
box
boy
break
bring
brother
budget
build
building
business
but
buy
by
call
camera
campaign
can
cancer
candidate
capital
car
card
care
career
carry
case
catch
cause
cell
center
central
century
certain
certainly
chair
challenge
chance
change
character
charge
check
child
choice
choose
church
citizen
city
civil
claim
class
clear
clearly
close
coach
cold
collection
college
color
come
commercial
common
community
company
compare
computer
concern
condition
conference
Congress
consider
consumer
contain
continue
control
cost
could
country
couple
course
court
cover
create
crime
cultural
culture
cup
current
customer
cut
dark
data
daughter
day
dead
deal
death
debate
decade
decide
decision
deep
defense
degree
Democrat
democratic
describe
design
despite
detail
determine
develop
development
die
difference
different
difficult
dinner
direction
director
discover
discuss
discussion
disease
do
doctor
dog
door
down
draw
dream
drive
drop
drug
during
each
early
east
easy
eat
economic
economy
edge
education
effect
effort
eight
either
election
else
employee
end
energy
enjoy
enough
enter
entire
environment
environmental
especially
establish
even
evening
event
ever
every
everybody
everyone
everything
evidence
exactly
example
executive
exist
expect
experience
expert
explain
eye
face
fact
factor
fail
fall
family
far
fast
father
fear
federal
feel
feeling
few
field
fight
figure
fill
film
final
finally
financial
find
fine
finger
finish
fire
firm
first
fish
five
floor
fly
focus
follow
food
foot
for
force
foreign
forget
form
former
forward
four
free
friend
from
front
full
fund
future
game
garden
gas
general
generation
get
girl
give
glass
go
goal
good
government
great
green
ground
group
grow
growth
guess
gun
guy
hair
half
hand
hang
happen
happy
hard
have
he
head
health
hear
heart
heat
heavy
help
her
here
herself
high
him
himself
his
history
hit
hold
home
hope
hospital
hot
hotel
hour
house
how
however
huge
human
hundred
husband
I
idea
identify
if
image
imagine
impact
important
improve
in
include
including
increase
indeed
indicate
individual
industry
information
inside
instead
institution
interest
interesting
international
interview
into
investment
involve
issue
it
item
its
itself
job
join
just
keep
key
kid
kill
kind
kitchen
know
knowledge
land
language
large
last
late
later
laugh
law
lawyer
lay
lead
leader
learn
least
leave
left
leg
legal
less
let
letter
level
lie
life
light
like
likely
line
list
listen
little
live
local
long
look
lose
loss
lot
love
low
machine
magazine
main
maintain
major
majority
make
man
manage
management
manager
many
market
marriage
material
matter
may
maybe
me
mean
measure
media
medical
meet
meeting
member
memory
mention
message
method
middle
might
military
million
mind
minute
miss
mission
model
modern
moment
money
month
more
morning
most
mother
mouth
move
movement
movie
Mr
Mrs
much
music
must
my
myself
name
nation
national
natural
nature
near
nearly
necessary
need
network
never
new
news
newspaper
next
nice
night
no
none
nor
north
not
note
nothing
notice
now
n't
number
occur
of
off
offer
office
officer
official
often
oh
oil
ok
old
on
once
one
only
onto
open
operation
opportunity
option
or
order
organization
other
others
our
out
outside
over
own
owner
page
pain
painting
paper
parent
part
participant
particular
particularly
partner
party
pass
past
patient
pattern
pay
peace
people
per
perform
performance
perhaps
period
person
personal
phone
physical
pick
picture
piece
place
plan
plant
play
player
PM
point
police
policy
political
politics
poor
popular
population
position
positive
possible
power
practice
prepare
present
president
pressure
pretty
prevent
price
private
probably
problem
process
produce
product
production
professional
professor
program
project
property
protect
prove
provide
public
pull
purpose
push
put
quality
question
quickly
quite
race
radio
raise
range
rate
rather
reach
read
ready
real
reality
realize
really
reason
receive
recent
recently
recognize
record
red
reduce
reflect
region
relate
relationship
religious
remain
remember
remove
report
represent
Republican
require
research
resource
respond
response
responsibility
rest
result
return
reveal
rich
right
rise
risk
road
rock
role
room
rule
run
safe
same
save
say
scene
school
science
scientist
score
sea
season
seat
second
section
security
see
seek
seem
sell
send
senior
sense
series
serious
serve
service
set
seven
several
sex
sexual
shake
share
she
shoot
short
shot
should
shoulder
show
side
sign
significant
similar
simple
simply
since
sing
single
sister
sit
site
situation
six
size
skill
skin
small
smile
so
social
society
soldier
some
somebody
someone
something
sometimes
son
song
soon
sort
sound
source
south
southern
space
speak
special
specific
speech
spend
sport
spring
staff
stage
stand
standard
star
start
state
statement
station
stay
step
still
stock
stop
store
story
strategy
street
strong
structure
student
study
stuff
style
subject
success
successful
such
suddenly
suffer
suggest
summer
support
sure
surface
system
table
take
talk
task
tax
teach
teacher
team
technology
television
tell
ten
tend
term
test
than
thank
that
the
their
them
themselves
then
theory
there
these
they
thing
think
third
this
those
though
thought
thousand
threat
three
through
throughout
throw
thus
time
to
today
together
tonight
too
top
total
tough
toward
town
trade
traditional
training
travel
treat
treatment
tree
trial
trip
trouble
true
truth
try
turn
TV
two
type
under
understand
unit
until
up
upon
us
use
usually
value
various
very
victim
view
violence
visit
voice
vote
wait
walk
wall
want
war
watch
water
way
we
weapon
wear
week
weight
well
west
western
what
whatever
when
where
whether
which
while
white
who
whole
whom
whose
why
wide
wife
will
win
wind
window
wish
with
within
without
woman
wonder
word
work
worker
world
worry
would
write
writer
wrong
yard
yeah
year
yes
yet
you
young
your
yourself
// values
tzteg49DHRedz63m6D_5
UzwVmGPC-Cs29z8JH-Q4
kaw37i2tCEkpVSjjAyVG
spLN48sjeify8jw_5B96
JAuzc3T_iLtfJPcyQbjG
NF3a66ew8ZeUN36gYxTX
s8NWwA6j5Fp5YwRDkL3J
P8Smbfh4Tp-a8z3J8YBR
_jCznKbYAAETm3u9PVBx
xC3rKgVgm7Vca_DkN_ki
JMcie8kkntnL2dPAwa_Q
uBebEtzPM7KM3hKEJHWM
TDpkrMrF-TXX_8-TnkmM
K5Kf7BcQfyyn_JW_RjeN
8g_tU_ePyhJTfSNK8GBz
h4JWUJHYNPSEdCN-zGWF
gMwPEGU4axgHhuZ62rNR
jM4bHS4cW2DhW4KEZrmu
NBrRsM_bNfapYGYRmUx3
UBWnK6fpnhdTBKGgQf3f
7dbFDGgHM2chkagmXGLb
LxAa5jXJNhCTZnAVSAyD
ZTAGHAM9LBnYz_DTywuz
_zVCnDD-2DsawbeNgV6N
hQ8Jjr3JcTX7y_aziWVw
siFcXG8xeGRkE8khcQwi
ukUWkSw78QVb38bCHCQ2
p5-yWxjLUJQ_bg_C_C9S
5tnEtZnAmWHHy4dei226
ZZhhfPJmyk3YkREVVeF6
eL-aAWBk-siGDWrBgtmX
fn9saBpnwPBPzyf6rE4d
Yrjhnj7Bj84PeK3T-XNS
-UWiEukzyhjmKrGrLKXZ
Y5LbB23hZkJDcgYG-Lbb
8EMSTYCgtRrHeneKixRf
wbxjtQHjRZpj5Lb5z3Ar
LcJw7LsJtRJcS6ZBUBss
GnLEHF-TFmzFt7zhx2d8
Kt3ZXkucSfemmi8i--fu
csARMr2ZgEr8n2nDkeCE
9bKQfnMAeu3ytJ9M66PR
A2StXpdfa22E6DGZH2gx
CpzKaSS6if5DF5DpVYUx
xRBiWJ-jAzyxR2L_Nz8c
E7bg7-Gfj8aKWTTmaBhz
GUt3VJMERJEnfun4CkeJ
DTrPpMUEW_JUYC2y2nx4
9CjJPYjpwQWDUy3Vhw84
udrWBnCj-zAFapY4X4gs
2kmNGHuNXHVBU-wz7s8n
ttcrjw2ehrC2MwK3fnUR
69-WGHfk9Q7KjuPcriwf
LHz-DCP_hY2WXVcXxH_x
uJxdZkiYQT7j3WyBngEz
ZLFVpHcPaPaGG36U3Kb2
7TR3GMBhPaakDARSsFCe
n2RADwyiywe8dBjGjtrb
LKcgR855RmY8Sa6F6jZX
2p-Nc6SumgCUjChkUVmF
eDg_jDbt7n_bMGK_jnhX
LUhyzX-TPzT_p6ihRr_N
gKjCrGWiP8y8kcaVAaNs
JaxpLGsWQRLQ4PDSFBCa
9GxYCeYjGWnpRgED8hEF
FFX8A9LC5iZCGhKTm-ZZ
VgQ7L2QSYQYfQjuaXr4r
njRmaxgZeytYa_HAdkhk
Bn73GhkpRabrQBzdmixH
_2SVk_kfwhWyTtrcL2Ed
x2aYAwJJk2gfhFMdzpg3
ZBpR5Lf5H4dHc6E_C-Bb
sAycn_6RxVnYsmg2ZXrD
N9SrZsPsEciGyPN2fAAC
gTRYFRdytx7BU95PTFKN
hpNMYULESPPkKECTsf2i
7cZziPsJw2Z-yAirUVVj
jPtuCwK9gtyz3wUjTRUk
8ZSy8-3Pcxi-WrW6n2bt
em5RpTm5Pt2GTQNcAnX5
8NcMx5nQzwwNA7_xL_TN
8gAVLPsD59W6NbTbfJ7g
JQYbseMeQr7hFTfKAK9r
G2bc_DsFTcd4cgAbtyfK
y8FiBpdrJwybPgL4HFTh
LBU4z6G3uMpQsJ9NDb9L
Vi5iPtmV5SKb9AJ5fycb
Q5uzbFcFGcVSNkuuK2uN
Zgm6HxufDaH-7s-TuJsR
fr4Qt65px5LE44NnybzK
PuP8nQA46FYwghAaPM5c
9xffr6Ugi8fkSkM3V6fF
fwPxFYzgT2KT3PGFUUww
VGVreyeP8FaNyLctbCiu
X5JpRVVHyLFwkVZS5r-B
dwxfwwEytya7MpLfeuHz
FzPxZ5VTM8Lbt4Sb6yG_
NsSpkf7d3ZQgNf7G9xWs
RGYPdRSVX2uydktg2UZD
iN9_paJ-W3EfHJMKjerM
kmtJRL-SWjU_aC-b9tmd
GSycJaNkdGmy9UiLNrfQ
5EWPcGJxrLDLengFnibj
YUwLNaajKymTszQxuh4L
NYu-bM57C_yKnSnsnBnD
9ftERTiZF_Khz8USNKtA
aTYA8Hg47wdgNLdSV8W6
fZnR-nmANQFCkMukwaZs
jmeXjJEXCN9wi58mRfED
9pZPHbAWBjEmeXBWXdiW
_874TYAJ7PnpmnJUN4Gc
6AE2cTY8W-iJbmDZbg2A
mZVM8FABr6ex3RmEMNzh
EVQFDBScGkGSuj2pW3aU
J4zyPr8RRHDFgM-BtSVx
mctQsyPzE_bZrx5WLTMA
6PXEWszZx5usmwLdSbJg
TWzSrrGM3dHHEB83siAP
4_snPnwuTPegSEjnmupj
9EsD9stjRU6i83_iyNzK
xMdfQRM8j8YVJkAgUz7z
aVGCdF4KBkfVHzFNmTJw
SyNV2Pm9t_i78Ha6kZC8
kMgRF7ZMz7uXS_ZYwezC
nmgW8bbHib2JjUAdZ48g
TQ6iW8JpmC-Dh58i26Hc
JwRWPhMGZyLi8WEZB-xF
4GYtcnYupJW7ZtyMUsDz
XKAxX_uEQK26tyBD5GYP
sifjdHaaNgR7mJDXn7ez
FuuyFsQdJuJ-mCfa3ktd
aH29mrz5-VDz3F-LWUzk
WdVCsPJGXMAfQdUaVJcr
JDhuuaY8b_gSVeppCm3Y
gU25rBU7czTTkmpkxF_e
eTW5UWwdGMrEm39zHwN4
9r5aTY_6ySCn4ki86DwF
-7BFYa5ZzpCatJKfhr3G
kcu4EKZaTzH4sK6rrVVt
DsYBuki9gb5hCS_JBUC-
rtxC5Q_sYGAPTehReu4W
sSULrHb3RhSecj4SNUz3
wzU2u5NT_rP3rKMnaPrE
QwMegJPa_-nAKLbUYEYB
fuXbZ8c9s7xJsFuAhaXW
QZdcNempkFayZf5MB6Ns
5dfd8EKRjwzx5_dC7nd7
TyFzjGLNecxxhMyEsbwu
xSn7rcndRws9p4tpLANg
NRrwgCYBmFtLeH2cnxZ3
BmKHAm4hiWSze3DQuC_W
NMEJsMQ8_AWdw5JVMHxA
FPJnXaxJgySCr5RLmG2V
mTCVSiWSxy22dPaBuCKC
Yek_xcf2iLarheijWnun
Ym8y9_j7ph3Wj_-TA_Ug
XgN4xwkamrY6G7NBACEC
3YSD_QEAW593Dbr2jzNK
XiWFsQtFHFcXBd-g7Y66
uY_zf5TTG9CJu9HZDy_x
4L5xR2uJfEKk7www-r3t
zKRaCUFdhWdTmHpTW4Bi
DG-mf_pFjLpMeaV2t-Wz
3aWuhd9frHnVJmDmwEnE
6jVzVpWz9ByfnXzF5D-9
7Z6_swRbSEAeE6HPP3jS
_LQedjCwawRUwyTM3nKV
aYaHrbCQbWnVSDEYC2kd
jKMssa424zngCXUfdHQn
LK5AAhwGg_wj2tZYde-5
LenUN6jZRSDntfHAJHEh
kX9YrmWALtPQpCXTaakR
ZtPumUb8V64p3wUXeRX9
tJSwSFDfbDyTm53hAWUA
KSgWwnA-ww7Y6iJr65Sc
z9nKcULL7MVLK_yZt2zr
kHRThab2_w3zbDWhN4jL
9dhiVCamdZWV8e6M5kHE
96gkyDNJtXr92DFNwRDe
BFt2WcNNZHQW-_4QpQJk
VrJTDTuAhkStwTbsXU_4
gN8PHa88c7QnAZXDCuVG
c65ZcmQn4PtLVSrN39tG
EzWbnpfzRCrxk735tGPp
U4a_5eBwBPViUnNeX5Sj
RSRengDA5SerUpZFZEh2
VS8QfAt9B3MGrh6fua8X
kkuKc63HgWwzcpukd6zP
_hhMi5whjnmejUjQJZV9
cMb7xNNw2nt7KMpsTbXx
ZD84wzir6NdaKRmeGAgT
wuBhMSCeUk_mA5XdhGjf
MpAKtXB2KMBwSKLdsy47
zn-s3mwPz_dXek7urrFS
dwjPfC8hjGZUjSQTychs
bw_MTuGeELYKRBgcpdKS
iJxNaDzW46F399txbxFb
sjPhYMkBdLtQNTAsuc7c
zTzbsFCcWb6gUuu-FQ84
fsnuYwgMsfgUiShCApwV
Hz4R-ihgX7mjGfFmQ5D5
YSauVzrUntjzMKgGMhD3
LwYaxfGEf4bLy2TpTDdG
YS4Nb5XFe_u54NYEBbXM
dbUdpgyJTtsfw6Sd4wFF
3Tuuhzfmk-FeYnH-fU9Z
w3TBeGAK6u_j9dL2QEiZ
Yj2iuPAP98XNxZz6ZfgP
QXScn_kQcgtp7Yru6p3T
FD_RLSmTUVez9x_XAZAe
ifC5m9yVPHTpUUafCjxJ
gJ_GdPcs9_7DYJVy-nji
FUA7JjmkQzXNSrijsGmb
6WVbdKN3Lp8PtpnVJARB
LjDBR9r_b4YtukjewDYj
dYDbzUsTNse4Ru3BFXf2
PeSKVrD9ZaVCBgWmmksi
bcL9L7ZRyYYXt7nRztCA
4g-NgPJ4z3ibptbMFHdu
wY9YbD4Grz922K3uwYUn
6aFUc7eH_Q5buxzSPejg
9tsYRnsTwL5wZSPbK-Kr
dYAAHTVVPUNBFjgEdu3U
R6WjXmYBLN3c89rf9aUL
ykREV33xuf2jGQUyAMUP
UTGGY2LgmukV5DPr8bw5
WSUxN6t4A-CH7TZAuiSV
w42JhG5-2ZTzamPCTGC8
uRGnTiRZt8VSjyXJ3V63
UCb5HefCw5iAuyAL9AxS
-6AXLzSz2cAPAeZmtYZ7
fyYdC_uXtePVzQw-iN6m
3HMz28s-LP3nEGJt6PgG
8MXNDhN52Jcx7ZGcQMW-
78YJagWc7h2exK4Jp2sK
h3F3wfiuStNypxkF8mAZ
L2kfpibjVmy5igLb6Pdt
aWxgbQcCyPydf6Rrxxa7
87BffAM3bbHCe7tFYCWD
ZU5RsWRJMwNHztCe5gtK
carnK-zRHD3-pD43zsgM
gEGeeFhU7VEasdWpfNMD
D4p9NYr7d9uEEP5n2cW_
kWahAx_5YCKeWaBaVGrX
UXgK4hCa3_rdFFYtQL6F
LFKbQnaWYh3efmwaNYzQ
aC7t3twReujnFm6izgsy
ex4gfZKeB4KfiVtjnEiK
4b7fNjXPL2enCQDG4bjm
c_QMja5asGXWRNEeaKkw
L6XQ9ArEsFXaW6Q4huV3
NkWT4YikzrM3_aBgsaXd
GPUXjyjucmf73cc5c2rE
PMSiyucimQGTaRpdYXia
49ZtsGF6npZBn-K4hWu4
7kw_PbM4g5FKdaYrBBU3
zSX6x8t_z2akHCLVmfST
wt6VwxwYcGfrVbZQai9D
jFjXrQCfix5wDkYhc5BT
h5fGwBNsY6UcQyZJWK-d
K8rEyKwwQX68zTTQuP2W
QCWeLkDYuBHfEG9ea8HC
-7KGEYsVKDASy2aKZKup
eSTczKdLNCQ5EpsVeCFV
emQS-UYibW9uiQUpbcKW
cxBHjk47HiLNHASX2Kxx
HjbKV4C2KE5LmiPyZcfy
jJYwXKR3XYgWtHmtguNs
ZrwNN6QjJDA9Jxh3Cjng
3zdEe3msZE9s_MrEZkp9
5NU7ftp_zLZShAQDRknR
xjuJDLpVpxswmahrWsTF
EAu_e-6rxdigzpWscYSa
Yz2LDDDzgEuY9PFHatdC
BXE-CcWywjRAY_cZz5Xu
AK5-xnMup2GJ6t3N3Rgr
DFhhWyESjD7ga7bGYHaS
eY_YGgjiFnsS_ZySKkpn
AmX7-gAk_f75RXtiDLW_
MKh7uZY3xmGsAyTr7f-Z
UCe2WEupXwPZxry-6_-F
Xh8ef5P248VbPaL2aZxN
EfbFV9mtyVemmkztfTwQ
PdG-4tREKb85eSfEa8Wz
suGNfYGuyDzSdhcd9_Ux
diYjfrT5xiV_QP7NtcXc
eNxZ4JtLzwc-VHJB4WNr
ABVgAeAmNsp4erEsrsiD
NQcRhMrasZDgWfbTt-mx
xx2fFrYzfHaVQ3fG844y
9PyYz4Rd9kEx8nwRd6U5
eZcscnYrxeNUnzwCgbB_
DxMwRd4sEr4FtTusNs7D
EEb3MNen8aXTVnDeKQhX
GXNbU_B2AV3uCDgfbi4L
xrZuYSFjhEgajLWXsLiA
CKM_FkitT_UVRrrsP3GC
K8J3Le4BRZKAZytFSNJb
KYHtmssr8XuFFy3Y8A5t
9FjHyLw-RHwQzkLfH4Kf
Szj8BeZUk5nfWxDt4k_2
d2YYNWjdMmaet--yWuTe
ZJs8jiHwYeS97fTRV_yF
2y5tTXBkpjxBjLB6Euh5
BfM_UrPMyQ_grrDCirRm
jzssk5r6DmYcURkMLw7M
5rWWBBcNYJi4cmeuHHKh
GYumH_WXWWVi8_LTHSYF
9A4Rab6b5nwNwjwixeip
QyV9rSgSmRJNxxVYFf2F
e7MHGutKTiFWbd63BmuM
K5Nc4FJe9gYZmmxRNSMd
63XTEt6Ud8BS4bWcsB6y
T3dHw9hCmj-LC_6xC_PZ
5W4WKRZmMTV5QFzVJS6p
pZcx2ayFzKxQh8KM3jPG
yL6pCkXsFpCpM5ts98m6
Af5K7QiEH-X_DppAwA3H
dkbM9Vc7ek_aaWJ59CV7
Mmys_r3nEnZk3DXeMd4R
iRYwFBdNkjAH-NYHPNR-
8K_4LUg-VWfU27rryBkZ
3-reaUJHe6yBmFmLyj8T
XAVw6DVRANyFyYCQgEZh
2hPexkw97Y_HbwAJtjBP
PAdmQZBgk9ASrPGRPn-D
Jh8ZzbPDJ7JjjpmcwDyC
kWr--Pyb6zxtrRCUDJFa
3kPb3hkHxy2KCtyduaZi
z2cwDJkwR9nbM97DPycY
F8AifUrVxFwPi2kT58Y9
Z2wcCJKibDmPmWZLE_5X
3nVxiUDCgWRnF8XrY4kb
ewA2FQ7fsAfW4Zzw3PCT
nk3miXEwgAmkGJfH_Rjp
6kE4pGsjxp3jgmKw9Fas
uZJ6s5hRhL5gSY2iRb4z
sBk89kdrnALmbh9KEb9H
HBhs9eaS2NYy_7gRxF9Q
PjnipJ3TJE7GCDytuktz
6HpCSYzfHa77iEkUFc3g
ZHpQDtL6GBrKt2rmXdB5
pZ6UTjRaCsK2zXcWjsB-
TVjhWUXug9C64QPNznPa
sHtzpufirhK7rrVSDbHw
LExP_PUuPafKx363_PFY
A8nb2zJh2sLczHaxxWbm
ZsxXAsSkGpfCMm8hm7Un
f___9zAemKKz3QUYBntx
x-e3Cwywk4DLQJ3kxVhB
bSUckWwn48QMe9aiUpB8
BkKVkhGyk5WxUGfs3Xs3
FheYxsfw_zEHji8LGAxp
AZJScUGtZX5cYYr27ycM
BYYnb3m2wsFtppeJTcRg
FwyxPaE3tbbpMQfcRbf8
GmmLrKmGDSeFGcL349PX
Jsmn22xGBxdbC2shxY42
ahGHKthUchSUJPHbj_Tu
86Nk3_6y-wprbP2xSZKN
7JUGAA8L8MPsT4-5RgX9
D647U9sKESccwiEcFAZz
dGiuQ8xYBcG6me84Q7hZ
Za-SWxDfBJbD8NBQFCLE
Ncx7rkVRef48B-g4fRTR
X-dTdXnpwByWPJnfSWgQ
NCRBfTUSxH-YYbXgff8n
5E56T4-8siehB8CzNEjF
GmCbUWry6uCN8yawzRey
c_RyFmiYzTE8jXmtixxc
YJwmNH8t9EHLmWNLUsTz
2rFAFBaGc6jM5rpDSuzc
EYbHW8EE_ejKxK4b2LWA
XpBUTGzZRkd7ZJHsQMLa
atDinfT_ZFFpWnNBWzr2
iGb-g6fjFBzSmZAr5NcN
8T6YpXgVDVH43AbHCz8Q
6eL3uNxVwY6FSYCbENd5
7raHUk2nVF9gGtRYetb2
XKwJnh8knYhmsHbS85Nd
dNwpm9zWS2-GCY7jE5YL
TPtJWVPkcnmYeBRwHfET
jhwaQ8ti7aVRNTiwipBm
X4EGUBpxabr9N-e4cZeY
RNd-VnFmxScAc-HEBmSY
S_VUFzRtfn82xcKnWwAs
akxAZehdjY3pSryFJMig
Ta9zkMYyC5E7y6ux8x2j
rKg52Wsh6LP6h3k658jS
fjSsrTCY4-wFcuZLB8Cd
W2pUcrHe27r_G-smkxkD
LkRBcej7_uc-z_Bg3TRQ
-wcX_XBaNHKEcnHYw3z-
up2YEV4TgQJzc_xz-m2J
xPaDg6xkmmb3ktYd8nJ4
wXRTHVeBXJfjfuue_yUg
cX2_W9SJheDwZsgR7Y3Z
ZMcejSYK3pyYKLTzA76x
A6RH2dxJP-uzdK4zuFSx
z7HZkucujJwndiXe3uNW
p58Mc9AG6UDWeAuAkw8y
_jXL-prBAQmhZb7te_cA
kYMZDNJU2xp67eCP4rwy
yE_N8B4cj8Jre5TA6EkM
z6fnp5ZBx8ME7nFhZZhY
MUJSs5LBc48C5kf4RVnB
6eRQRns3UC96Pj5QQ_yp
LXigCSLMKajQGnk9e8ef
7kagLrscP27n_pzpY4te
pEY4EZCRurPyxM35aHyE
mRDRetcQWQe9U2xVcK2m
9u5yQtJCFNgiTjrULG5w
x2mbiS2UeQzexXpX4snm
GbGV-cTKRJMkWEN_TaW-
yd7LN5ruAJT82mVGHruQ
BtuBa34fnad3gWJNA4EF
6TtfhGRx9teunii4HV9G
iz-MefQhG_FNsXFn8UQh
y47msYVSri7KFjmHX-j5
ZwrCDjVs_FY7gKAsU-Vm
2rnM54fwGnJLAXUfHSBe
2iCGHmCJk_rch_76Lhab
tZYF-9GYLSN22Gp58_Bz
5mCBiRWb42N8PtsDwEdN
4FnDEft5QksN4-YTbz2w
hHLyy3Uri32iPTZt8B-4
rb9cn72gtxt6AHjng6UH
9-7sy72LkBXR_X2anFu4
VeTMNnaA8gR3sjPWPrKe
hk6xngDktY4h-GtLx78h
N_iKbQR6yxENz73whXEy
p5pY3228snhee8QNi8mi
Zjp7g3NBKBQTff6VUJLZ
9NasEY5ntwEUWnkiFMii
5XcXkgndn5ZFGZSaw-nK
7xwaKRE2gMm9k-Jf75b8
jSsjMkeFE9apCKzuCWGA
kXGRCwuKYm5fZRrSp-Lt
aDXWQd_hGmAmNwA-7cQs
jCJpy52T-QC398B3AuY3
g6zpY3TdVG5tcTk6W4Ag
Z9JGcVsZw6w78FueDxcr
HNEXWh3BN3H2JmjXjPgJ
9J8GtBxWc9F6kFub3UUf
QNiM6k7d7biX-Z6XxVCY
mnQj_wmbGrCUnG-FcuPH
4yW7GB2nDBdb9j7hGNCX
x3Ckiaxu2BTQ3EDhdame
yy-ZTcyYdGUe3ynu3KgL
G3hXe8B9fHxLQa67fUVw
6K_udQNdU3rGefanrAtj
tuxn5QDZ34ctaKXC5QeX
ZyrLsV5PxcPwSBLejk8G
cRshFYzhSk8YWLxibaE2
J3DEw7f6z3tcVBVHSDGj
KVQh6fHGHNpW6aRtWAJG
NfgB_PDe7w5W26aN4Ptd
_ire_tyZgtfULKN9-as6
XSkujSA7mcBaX4h2xHfA
eM5VexWJX6-FrN-ihS_m
C5keB5bN-Yijrtxdwiu8
mUhDtteFfe7MtsXZ34Yh
GaK4UmhRPZifhW7Tn23H
SuHpztfVJpu7GhndRM-d
RSyJa8StEiZWVUEnYFZx
_LULDYZ5zd_wjFMW9dFT
FsxyK77exeY6_Uew3CWd
Dzidt6zU68DeRRUZ2hWp
4kMWrj2Z78-B-D-EuTHm
nabQCgdMUaN44ZU66_NB
K4TTmrCheLFFT68cSJTp
2TeXw6N4igaT3bgbtdri
SH-VXuta_yNmhzWVa-zX
fiKFSU-DsAk3a_wVget9
x5dtW2F5T-PYHEU8mybk
kA2XADrzNB-WVdu4bPry
hTRZVcmxkSUdJ9wEs4zz
KsRLkGYMdBDrVy6DSuc9
izpLZmYt4A9-ugF3EVaa
QS3UcWUu67kATwihtWxk
UsMMjGFpLNeD6PQjdSFK
ZH2mwpw7gwcJRWdTUy98
SifeaQMdkY9RWwn9G6y9
BjFWwfgHr9iS7F9eSZ9F
fV7TL3mECXBZVWfg97B4
6AFzMmc_a8Hsp2nLVppT
VxFGWxtukCCcUj6nnUys
TWWjr9a4ccmLgQc--3mn
Z-DUz9VFkmX83MLt__zQ
dARLZNiY4HxBMGP6aH9b
4EtyikL3CBg8ZJ3xaSeN
d9W5fGf2J8PbUuSwJ9X-
wJcgGbf2jhgF42nCDRbd
i59ZQcsmAEZYM4yXzdnT
hNgnZh2Ay_-DxmB4xpSg
7BQ9JdK6FNcksNjMQdUd
3W7sdLKRaXiQAMX-Xfzp
ZSaiB69Burfhm_ZtuM6c
-kHnHM6h8_w9jkbMXctQ
t7Bn6LS9fPyiPg_hEAdD
pQkRKhkDN6zmbp8uNapE
Qx__DiCukRy_PzmQhH93
ach9TEwd_Ygm-fdQk6zL
ucch8KnFUpaGuusxdPXx
4yMUXMF_bs6ZD_iEK2xU
c7RVSrLkKS-zc59rU3Xc
tbZFfWQGiKZjwVgJwUYf
SyWsDun5-md83P6kL6e8
2YkiTc2u5rTjEFKhhHUa
gHZF9pFzfZH5ECYx_mgK
wR9ik3HCuM4Py2Ktdhdx
K4zGwaPLsb5ApG8-AYDn
DjY5kTBL9kmtASnX9Mxr
2Cp-KNDX7jAAybwAguFz
YZEGE2MFAuTV44JFEMEm
wbbUxUT7dtdTQ4T2XRZG
LbkyN2sHcDRuEVUnrCHR
3g2ZSkwgiZVmdLiwpfrS
-58MmXGeUWUfdwVNddag
bFPh7t6tenYJ6g7Yz_F7
u5LyyuamCfkh_TX_i-G7
YNee8isWdNuVRSSa-5Qx
fwntCtBMccJ-Q6Nr4Hc_
ZFie2fpNPFnrZKpJeGsC
cDAz75ZmCS7xDyH8wCbL
Tngth-JhD7JcXHQbsYKG
rRnEQmZ5KfUV6n87Sb7c
GKu9yJ-wBnm-9HmsiGL5
_hgsbrPLTEyZXyLLdEkF
MetT7b5iX-JwEjEBrGN5
K2WiciRHdpS4wHSMhcdw
cXx8Hr2ASxCQN84jDFhb
SpeQs2P-Ush6NBaNUbFm
pRYug6Ex-CrRVxuW7gf7
PQ5-thpu84zRXe8imgRa
Eb4mkkXnUh-K-fkH75u6
5sSnZDw4kXwRhJZYk8jK
94XbD4SAX734tswemMZc
2x2WBWXpgshX8raGDzp9
4ZjpGdQhLp-64SWyzZWQ
ndRsjM_8xKK5VsMiYS_d
P_b8S-esHcYku8HANnNP
xPCSpmmX3-GzpU_8-mi_
gGDfWXdbeUyWKHstTWSX
mz6SE-rVZ3sf4HL-WjsK
NHmPRMkAgDLmYtmQrRAE
NWaNiSPkbBzi_e56Wjr7
TxF-AbTzn6KGBsgTXhJK
B9stEkcJYjRbJy6HnA5J
3bb4jVpt5k_xpbYHrhZS
sPTJMH5BxfpVe5rFucjk
VpjrC3YPD9czAGT2QEt6
ABLQinkRzQ35Kdj7zga_
XwifLb_ZZVbye3XLWscL
YUbgmpLAN3UnK3RhCHR4
6JV8YjmQSUyaZLQ_8k8_
mTikUUk3a6yQrdD4nsPx
HBE7NwZU8kusbH2p87k2
KB6UQAYedAT3c5sDF5Fn
fdPwMENPR3pTQh3pEeiE
GA_QKDFSsf6iA2xm_xHJ
LredRTgA_-wznhG75bh3
WpKWN-VRizC8V67-R3y-
cdk9T88jFRCpHP7pMYF_
tyNhipZMWmwJSGVCsznY
eUhRGV8_5t-r5sYxjcsy
SVk2tCwFR-4Uu2eJkk7r
9h3HHdFUhaWubNWZLmnH
5fN-kzrEFBGPThwMCaRJ
chG-KMN4jyj53e6Jx9hQ
jr5gM9SR6zHVruyzmakR
c-FiwwS7hgwMd_b6hiJE
rK8SyKVRseZhEUnnUQ4a
PnZSUEBU3EACbsTzfEST
i3Gn4BKS3RrZnTkkbVFb
RQ2mrPNSrxhHrScQjnHT
3znyEjU6aMXM7n8wngBh
8LeKRdEFkp6ze6LHrdtB
ZWTbG_SmFwwTFMjUWhcW
n5wQ6jE7tiga29cV6Hne
8WTt-geGPGTX6RWGWat2
bPE-5EiTmikQAng-sesK
NYURuPd6aeTsU_i3T8QX
bkcAxFLbSQTNwGeBht33
4nP4bA6Zzrf3GKxN-Dx2
pgTUiGatkpNyDRzb2cNm
g6bygKfpAGQACZ73a7jS
bigBUM25z2Dg_D73Gp3s
xBf9TXF3GMdt9H33GNEK
ZnY9apPVwSnh5Gb5yPmV
Ufc847-xJN3kbniFiJUt
9h5CPxJ9kj5yahQBZUrj
JCSjWMRASSkRh2c2aKC7
KbUwHEzjsJHinfxwmt8K
ESjgZVBr_yZimj7E7F5b
-jaBBMfuVam5R9eGKhTm
8jN6DFuxPcRMX-tmpCWR
j_YPtyMVs6Ly4X6HpkmE
zdb7ZkkNgW-ygbgNiGkP
PT_AZV7sAmiKkzUPSpcy
8H-gnPE2KdDm6XAV-rD6
mMYRM6S4iTmdZsLPgY83
H_EEFNDcJQFkmyU6-zwR
zC7NHUddLzXBMbjrTj4Z
f2PMaKu67ySGwf8cnfEk
ep87ZCxjSdbiwk6mnbbN
_UjW3Hw3NKjQFLhG3nUU
hLK_N7K4Mn-fUMTAjn2p
8FJ_puC4Dyk_cJUMxTWY
wQAKGHAiUPPhKzsaKxx3
D_GEmsk8KmsR2egTk28x
54QbfxiUirjAFea87ezM
9CX5h3tERVg9kjXa_uA5
h8WBsjMYw7tM7gijYaa_
w4ekKWLRPWLaCTQ8MM3k
dEUXmYxxGEuiDnTz8Bc6
ipg8uyLf5RtMFBeeB8uQ
kdcjxYSCZDW4wtk8ELpF
KC7AtjSumWD8QEb4PJVG
zDiSLpAxrALC2xYTSYC6
ykmP9yk7i6PsEujz9y2X
BdxFxH5pXxjfJuaLpca3
b9hAcn5H__US5X_4pbhG
XErn5nHzjGV_wX7SRYWd
47N5t_ajhFHdtw9snkr-
abmg9TFysfU9tTr_FLMa
F8H5zX_MxiwEjaphfSW9
hbZ9TAWbJBP7ZaK-3e4b
R2RuHGKC7K6HeB3mgfMe
b_jpwmVmhMB5c6CU_-Rs
XxZtWKG5B65XRAchJNVd
JijMaW2whSXWPLVSzDCY
sUEktrhRgU45hzWrhLcx
6t8_pRS2yD4aDLxrkhUg
VNm6UVwJU4UNuhzSkh4x
ANhwXK2ZM2Bhwrn3UB7W
ZiKAAUPe5c3VSGY7yzbf
4juwjsfsmc3pyysdf-kp
GkaauVUQZVkXHXNPzVSG
ErdZWs2ztG5MQMHX23HV
B9nQhgD9zzxpd6FQQPdX
6TU_hXHYk8mcsSjNbPz5
P8gZxBCj3zCkgdM8zbd5
PUgNTZ2FYwXGz35swMVy
XHx-H_ktf3imhw_8syug
VmfpRjbVpExf-fzpSd_t
BuDfMECCuWZi-gf6DU46
m8y5_3uyyXD4rttkVxBR
a5mpLXUV3GPWUiLQA476
iPkxA-h6Z7mW4P7-x7eS
CAxxxUFbxgKPaWAKNgAE
XcBL9rSgLPaJacd3-53C
dXTg-5siBE9CAZAdtiJG
K_5FaegLGnQ43H8n66MD
heNka2PxmDKE8U2DMFXJ
bGNCtSmxyRCyxYJA6TYf
WhaZ6mpYBDYMzfsMSmBB
DC_eUCRGFAJJeYrkuK23
6dzxstpiYPrU9MDMzA22
k79V8-8txcU5xVjZVEz4
3VDJr8gey5f66Y-Hayak
DExWJFGzjeg_WzdDStBh
6zYBB5nYHpaNQbrffZZ7
VuDt22CLMTw4N-Myp96A
P8jCccNmuBgir2xayyjD
55N2M2G2AQht_P274n4x
8S64KaQr5AG5mzDYzHU8
VryEn_RySX_5k77YuwGM
AX_tSZ5xYGDDfUe9Jmjy
bcWY2rxerpp2hVFnu6Py
YCWMcJVWr_-FtdY9KDfB
8kT4r7xtTV5DaTdzDacZ
BWCUfCJ4srh94ephncih
3Lu5EU8tPjp3w9fjSzdj
2ZuSm_52dZyb59-23DDG
zm5pwGtEhcVGHC8RWtyY
ikWybDQf_XYrEJP7pu2U
xWWrjK8VQ5wjigQ4NUb7
b7FahwHhpdQ725MN6c5g
ncpWsP2SdbhAM53L8Snk
y6F4GBjGFLExLpKfVnLb
jkYfX9feWAVwyJ2Wgie3
GKYnAQUrPXe8mcwdibK9
aniwupKjLWGQ27uiCNsD
3NbJwrkhBhVW_Q3yCebS
jsjGhMBysWUiHuUw9S-V
y4A5NEXEXm4_KK68X4UF
PcWkGDk5r-iZk2upkP_B
hCbFMny7BmdkhNaxug95
R8zxpdw2B8GhRU3JaAzH
tsceEEw6iGUAN8F8tMbn
U8yF6_fk4fAVjpDMfYDP
EjUxmm9e4XD7Q7XQB5is
azDgXnitzDpZAsgBbgiA
y4ZQF35464kFdaz4hi3_
d5BR6WXgbrdQpA7PrDrT
WmBALdNVsUrCCmR33syr
MYSR7ZZNRCf2szBLV_-t
23uWUWDsGdXJDtd-QTd_
CGwjzpzXkPt8c9VCdYce
xUXU976FtJjLY3kNSVTb
sH8ATcDd8Xr7_Z_KiuU2
_-2Vks4ksxkaNAbdxFJQ
_NJxDBjUpJ4TSCeYe2FN
9-Weg84EKMfXzHVH4z4t
24V8MMFbrbpF8V5XbEZ9
C7FeJeagdYnkKNfHG4e_
6L7YjfraSuwxktH2ALNB
46mrCYKwg4Cjy3E_e2yE
sTVV4UhSfS5RwwepR7d6
aaGsQQ_E4Ht-kJ-FsYYN
eM7RC3sHnDJ2Z7ESL6ZP
CWx9E3-abrP_XjKF7muK
WFXpbeADVC6mKYb43Rkh
MZpYLVcLJWAuyfm48ifQ
-3Cz-jTV3dXe4nbdE_95
Ae9fR87rkTFs5FYbFFTP
BAW6xPEu3r5BXpTVUC3H
JKusLCDSkwduYN_TajVF
fgs38s79ru6pmHDtSHG5
LyXSYaay4XyMytmFMkd7
ZNz3ySzPHGg9WBLRpXR5
-wm6a6fumhQFcgzyAiDU
BtyxU4yPat7mC_CduaCz
8rCietBzfGg3DguBBbcr
ib-9RW7GXCNzMM-2cHaE
SwaMd-tMrVamDd2wMBF7
4_FDbRwGEbL93Zjtp6zm
ebk_zHsbsMS_i6rhRjpE
a5t8Gr6tMPnKV-GNsGcA
Aizh6V_QCmGMe7hXXR2r
44_SjNkP2ZMGkW-PtzEy
Y6TjUJ82uuLkGgQB6bm3
fn9Ji2mRYQTEuwhPtGWQ
knYPLjBctLPzMUpbwPWU
t3W4h4ifQWhzc6NHSaHt
-mxF_grAsSJ_Ebmtf42P
86QPRTEgyzfdg7BUXNTF
PwDg2s9TXWXu5cBNbPHT
z8Bndy4UR2GsDUj45EW2
iKAe4h5UKTsBJ3stDLmG
cXXG74imnr48mTwxrPJu
dUZSEgWu_3rA6p5TdiZu
HDM7apzKSZ__TUw5Wycw
PL4u8ib8Z4a9NQ-D-CEj
QrWgWQmQhjNpsNXTryjf
3kx2wppKE5k5ZcUYy6zt
fgKwhrBadwwYeuftFNHj
PRArXhiceas9Giz8zY7T
cxfZX7a_V5riAtuAQErD
Dg_6JZL_G4aSTN2ukUw2
zU4y8RWh8nFftTiyYWbK
jmeDE2ZyjJgehRicuT3z
mWA6di5WNfgEBwpNRNgy
_zPL3M8yshX5pYfm-xKA
LbCSSBGfmHN3m65juSGr
L2kaYms2fuPxusG3dyZT
u3Jb2cEpVHhAuxKj7fcz
u4jfu-9Uk5EC5_gYEdEz
GRGHSfhmaHf-pjMrpjPM
VVpd5T7EZQLCPCuX-J4w
fBUk3Ee9iVuTuuXKsXub
9BAwzfHKYjdegjrMrLdz
hpxG359YjRBbsH7DNndr
ND3ZEzzxiUMc_2ViPEy8
yQs_dWg6zLdLKNCwBGSz
y-QhxiuS2KSmkVQMPN4d
mgzTDsp2SypUbcuJUNuy
zcuEWr3mn52pCC-dk_Qg
hPBA_2_e_s87Sh6azjmp
AkWNNDx9rTXpHuPDYmyw
4pJYFWbhH7R-xjRdTJ3W
Ua6eugBFXHLT5UMsKQWc
6wecBJKFrSn-rzVUPWBA
6A-crJuYV8NJcRBC2Q9c
VBV8PfHLmnSSRudHjAj5
KKfbh-YmCk4SDKXsyB7p
DbZZVtngiB7JygTemKBT
Tj2T3R__QfHrQrJjKLFw
ZKUe9EVTLRzC4igRzMYG
MxQKpZknYAfyJxFwV8s-
5xwDbZhsSDHeWprZ-nui
3EgYRxJPFigm-G5GXKcJ
z36yXnuuJ5CQ832KPgJ6
AA5ZSkkLGSDcgCmpHCEb
5SbuEGnwHVADa6cJF_8n
sECBx3PYy94b3gud_htD
R95krsgw2XSpD4J3s4HN
UXJeY5LsjUudNY9uAfZN
BwQz7bhaJ6Tr29WQAXk8
QA95bZWxiUutwMSd7K2X
b6K9bnbdxkeA38Gjn9K9
P_Gg7W2rKQiHHDJF6-ce
y8btGUYtB2i4JwBVJPbL
dPumDrfCkNxTfQA6ynpG
QWpGiVHdkxwkyXr2B6ix
zs2mrzLZB5PzFjzbHksE
YcDf3sTaZ_fMr-6GQ8-b
EUgywX56HWEpQ6SxfMQW
xHi8b-X7JDXrfiSbMffT
SxAh9PENymd3xhWE75hx
NxzjVh7cX3_UQM9LJu3M
Jb4HKgEj4T4gYEDhLZXe
yyXCmR_sbV_fXBdcSxZu
9mN3Cbi6dMihMJax7x6M
wy7GyCZFGQAfGznDt-6j
fpkyM983rDtynhmGGb_C
NG8iUgJsPfKw-ZAdkYrQ
DcJ2rTN66hEJnbL-pYjE
Dh_Df2r3Qy-Ptzmcg3ij
F5YER4RwN5gwrrATPSQG
JQN9_zQ7saAGEx4XfXmk
wnfxJmibkVya83DXb7ML
9cyNtrch2jAF-G49LJzg
dXyjLiwDfy5HDuF48gdH
7rsLSpamiS9a2diDHCng
4w_gWQrtpKJ6LujC57ai
EhyNA54DThNXgz_UN87a
y7sMLBhFp5Jcgn6_uLEN
e_L-EanxRyZxNfbsJzRy
akipdyXRNaXCJnJRFSpX
uE3E9RmVtb-bFnpdYQJH
8WE9Ds69NaQwDYEVrmcp
e2Pg4wjmL9y3nE79bjj5
jegfak_Gg8PF556Gsgbk
NEX7FfehrBmcy4yPz9nR
uKxtzax_i_ryJLhUDsnj
UAZCA4rAKHFN-AuczHex
5g_6YBGsaKPT3Ju7CQ4J
u9dfrWmFN4CEKTxwjJHc
M2hksVWcV9Qt7_3p7JaP
_ah7wYxjzzz5PDWZCU-H
XtU3_7LRkim2D48DMnYc
636kJYcatJg5tye5agpV
PQ59df2a8kX2HK6N-xMw
Ggy7Ed3GPm9Zwap4YwLR
2cjwBBuYRpjTz55Bi7YZ
a8eSe-e7GHajgLYd7X22
DBjjKA6y5FM4W39d2VSR
T2zptECCTSuU6fH6AkwU
pdECYCRrfrMTAQXKDDQj
SiQCe-cY-CjN-uG-mpEW
XJ5YW-ANkGxaCnujdTnz
_-P7rkByMzwf4Au95r7_
bWpRraGdBitfihhH94bf
MedWGp73zuZU3AbnR2-i
EYbhC5V279bd-FNj-AEs
iWLf6AAHU_pXVcKB_TU6
kMNTWN8UfzF8SPkx2j5k
R23kYPgCT_D8Dbz9aP6d
DQfd7Dj8d_zPxBUUL7L5
HaDEp4bCPbawiGsQBAfW
DGTNfEGhfxhyNyZQz-uH
WDbGrucAbhMVw2QWs8Aw
BVV85pKAua8Jujy-32pk
iG3ND4gUwXMDnTFFL2TT
FEH5_nDb2d7zmbM7Wi3y
KCrBM-dmz2dT2QRzDD5L
kbFQ2nLi35gznGwLx43V
paV5eWcBd4D-geJMrWJt
kMeeFhU8MLwF_RBhwrAz
ThfWKsmYDCLDm8bL2EsN
5Q_PLLy7Ep7ZjtQYPkF3
A4nTbayga_iQFsHjbDjs
M9taPSChFT3WgiVpecJ9
R8kpE3VWk7m3TFjnX_ZA
8B-m5piSxAFfJxwmQiER
bx84aJrp2HE6R6QujkGQ
M_m2eEt6D9yz3XTrQz-X
yYYdkN7nYg7Hih6c-WuC
TuUx89Rzi3Ncf_VZrVwk
VjYBJRat2-ZnuacDsz-i
gKfrtb9shFxDne4G9JcV
7mH8W_WJHDjZUprtkCEm
yHdSDWyuzUnSb2ETPWRW
mU64ChNjeWFbrW7jLEcF
MK3ktAgZ5YB3ebX2PF73
FY3y8sULBgyR3ALhsGRK
hc5xRcJknF3Y2BAthRZB
p9BLuXBB9FFUZrFUpEBb
zXV4nnxiMyxnDNhzESNK
_sJbdGztKTU8sRF36NwY
gN3pxBknaQiG26is4KRt
ukVMTajEQaB2ht48M6kb
RQwZhpJQSBBJyk4M8Mic
5k-8mrYh-_KD2a58gD3E
sNVyHuWczx5GV3xr3ZbR
XbQk2efecK_fn3Ngszis
F7_iZGGcsK_6CHRybZF_
ZY2GJr633fCyCgpT9pBi
FsTW38TmWwRELbm67f-Q
Df55bZSkNfB5zyjK7cT9
7hKQFaC6k7HkXRYwDTWa
wkuVimtnZsB9BEVdGVL2
xuk7L8eTttL5VDGBHfNN
yVxdsyBKsGaTXmctN2cc
pbagXiWRPhHatsXfWQz8
ikeicBj7Qrx7eHjCpcgS
DRCNG_GT5XEzji5gaedJ
Ztm2N9LAUrAb8RuNpbbx
cSgQsCbBum4-aF-UNKXA
3WVj2Um3sTkJpnJnENWn
udYdSgUtRmH_4T8Vc4ff
98rri845mU7uxYmnQRuC
yrHaGuTjUfZuz_RSZhYG
PetgFXWztsGLbwZdsGNm
9YpduGdaxDCtphV2KrEs
WrC_aEELannPjLKdp99Q
iWN_ne5fSURkQSndFgkE
UCTg-zYdnpWJixkWtQAX
iJ2hJh7PUFer_YSddXEN
92CTJR-_mN4wQuHzgtRg
9_tQtiMNnGEtz7JcMwWU
VBAx_KdCk7b3PT98hEkZ
Cz-YXs3x4HYaALSKhekB
eJMiDb6KgVVPzuYCpbmF
NUx6Mp2eSPQ5mG_NKHSK
MynFUQPPReyaJ_3BzANj
Ru3549TdNYFnGxnC2ZUT
pKWNUAbg5xMd6jd3c4U3
dKiKTiZYEeASk7in6dSK
u2JHEUdr5j2TpYjhwjrN
YUmzs8L_-uzGuxZw_FpB
WcQbQf5H7dRDpzXHHG8W
WG5_wkaFWJ6agaEUibKn
CNpe8LrrFrWDgaz9eNKG
ZcCKfEWsrVWnbtYCZTLF
-89ikRLbbUNndYw7U8FT
yRw7SUVFmakSkVHVdLHS
eP2Y4XnF4KeFewa2PFpE
CdUQBskHNzpKnkKneV4M
9SkEErKGZ9_3SwbKeHiz
LSnnt8WeGW2DyBjXEiyy
YMeWSfrfrCTNepMc7XFQ
MWGzBpANi-TR8eGucFpZ
XL-ZiayHz7bAUiMNs5em
nzEB_-Vama3EJsB92haW
RrK2Su6wx8hAmgLB-u-z
_bX7J9RZpZwxMrMMYrYp
N6DUeTQiyPEM8XrPn69E
j82A-uZgjkVGA7pZHbSe
N6CmdCm5pr4gU2_b7yUs
JdSig-ZBGuYDg7hfGMrU
3y3jCJu4hpU3yhBRGWz3
Mb4VsSMpNYruLz5xEAjp
Dgc6HTYAU_t5NcKFnmsa
3NSzAA-rweEmnWaXdH-8
cBuj_2_ZGiLcjNGYJHYd
C2krd5itVJDrzszbD22x
CetWm74tAQmxHzD_xnXE
PAm-uAw4zagZGHVC6ZyG
suYrV93wmZstAkJwf4h6
HzzdALc6gTf6p8A7D2aY
j83mR3gngjeJG3UMaw43
Cnsi3yQ8ehGtkuiMf-Mc
rbFcGe5Zi2JQbVNAZ2Ep
wnk_Q3p-JxKGXWDVUCBH
t-H73_saRaLcJmDMDXyf
aKbugf7Znp_y2ZfJVfNb
zQ7mGezZhxi3ESiZmY6z
C5LnJXUz9MKy4rpKz_Ku
nTThP5SEPFkj9B53LDBG
EfPHPADVaiRMFH8AR-EA
zJ6Qh7MwEh2i3ZPge_h8
x3gPD27pLpTJE_QL6p7T
Z-ud6Lh7gn7nxhiuWDFN
32zfbCRhAUbNb9TSTdAR
zFbV_KbH6TThMTzHyrBt
5kL5NAsVQpxFW9GyMR2x
X2X78_XZGPkdx8suLyfM
WdU_Jh2EDCiNHDXV_4Rn
NVhTC6NuBES-6FAdYbhd
RKKNu7VBbcDC_aC7kazV
jSpKLNchGAR2wR7xmUJV
nLJg4HVe-HMQbN77ttQD
3Gi26wxUrQuGNCu23u3t
mUejhL3wQSHRich_6brA
GdMkSp3Hj2NMxCFrYwbY
eDrtpGsm462Ki-ZQc2Rk
CGf9VaeZ8HjjhYeTnR2t
JMSw5sZD2gxhwz9BJhSz
bWxwKef-TVWJBQ_f_KFA
kJdK2LdgQaTujFCC3Gaa
LxpiBdSFduGzFabNuszs
TEiNUEPERnX6hAYfaKny
jPwVHxaVitdh8ySk-8FF
PAMtTRTjA6ymRn8UHkKM
ncYbxc4SHJsD_8baVrkk
pZKYWemMnFun9CxmK2m2
K8SUXcm6z7WGsgwhjz6Y
MEiXm5FX85Jy685-WAwK
AbxWRDmTd9jSTbyKYt4J
M9nDaRb94xyRVMTNjfY-
5e2CsTLGWpH8HAJTN_9P
BDTbt7Bi7Dpgx8cFun3a
simSPrcKCfHdZnxfCjyb
nS9tHn6gBxBxxLxX4JeG
Ct_Xip4DSMSj67RX5ArM
tDQniA5bwGiDn8-3fx6P
i8jHKMSZSwJDVBQciAQc
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1