Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin sealed classを用いた、 ユーザーターゲティングDSL(専用言語)と ...
Search
LINE Digital Frontier - TECH
June 22, 2024
Technology
0
190
Kotlin sealed classを用いた、 ユーザーターゲティングDSL(専用言語)と 実環境で秒間1,000万評価を行う処理系の事例紹介
「Kotlin Fest2024」の登壇資料です。
https://www.kotlinfest.dev/kotlin-fest-2024
LINE Digital Frontier - TECH
June 22, 2024
Tweet
Share
More Decks by LINE Digital Frontier - TECH
See All by LINE Digital Frontier - TECH
How LINE MANGA Uses ClickHouse for Real-Time AnalysisSolving Data Integration Challenges with ClickHouse
ldf_tech
0
220
会社紹介資料
ldf_tech
1
1.6k
SwiftSyntaxでUIKitとSwiftUIの使用率を完璧に計測できちゃう件について
ldf_tech
0
270
Kotlin 2.0が与えるAndroid開発の進化
ldf_tech
0
210
Road to Kotlin 〜10年続くPerl運用からの脱却〜
ldf_tech
0
45
Kotlin Collection関数をマスター
ldf_tech
0
370
マンガアプリのメモリ改善と解析方法
ldf_tech
0
36
Other Decks in Technology
See All in Technology
とあるEdTechベンチャーのシステム構成こだわりN選 / edtech-system
gotok365
4
290
Why Platform Engineering? - マルチプロダクト・少人数 SRE の壁を越える挑戦 -
nulabinc
PRO
4
410
LLM アプリケーションのためのクラウドセキュリティ - CSPM の実装ポイント-
osakatechlab
0
400
kernelvm-brain-net
raspython3
0
550
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
7
64k
Google Cloud Next 2025 Recap マーケティング施策の運用及び開発を支援するAIの活用 / Use of AI to support operation and development of marketing campaign
atsushiyoshikawa
0
180
時間がないなら、つくればいい 〜数十人規模のチームが自律性を発揮するために試しているいくつかのこと〜
kakehashi
PRO
23
5.4k
地に足の付いた現実的な技術選定から魔力のある体験を得る『AIレシート読み取り機能』のケーススタディ / From Grounded Tech Choices to Magical UX: A Case Study of AI Receipt Scanning
moznion
4
1.4k
LINE 購物幕後推手
line_developers_tw
PRO
0
450
ペアーズにおける評価ドリブンな AI Agent 開発のご紹介
fukubaka0825
9
2.6k
Vibe Coding Tools
ijin
0
210
Ninno LT
kawaguti
PRO
1
120
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Into the Great Unknown - MozCon
thekraken
38
1.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.6k
Producing Creativity
orderedlist
PRO
344
40k
Thoughts on Productivity
jonyablonski
69
4.6k
RailsConf 2023
tenderlove
30
1.1k
How to train your dragon (web standard)
notwaldorf
91
6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
179
53k
Raft: Consensus for Rubyists
vanstee
137
6.9k
4 Signs Your Business is Dying
shpigford
183
22k
The World Runs on Bad Software
bkeepers
PRO
68
11k
Transcript
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ,PUMJOTFBMFEDMBTTΛ用͍ͨɺ ϢʔβʔλʔήςΟϯά%4-(専用言語)ͱ 実環境Ͱ秒間 万評価Λ行͏処理系ͷ事例紹介 CZ!LB[VLJ@NBUTVEB
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO lαʔϏεͷମݧΛύʔιφϥΠζ͠ɺڵຯͷ͋ΔίϯςϯπΛָ͠ΜͰ͏ͨΊʹɺ ֤छΫϦΤΠςΟϒʢόφʔɾϙοϓΞοϓʣͷλʔήςΟϯάʢCZɺੑผɺ04ɺFUDʣ͕͔ܽͤ·ͤΜɻ ࠷ॳݸผʹ࣮͢Δࣄ͕ଟ͍Ͱ͕͢ɺ࿐ग़໘ O ͱλʔήςΟϯά݅ N ͕૿͑ͨ߹ɺ
0 OYN ͷ࣮ɾϝϯςφϯείετ͕͔͔ͬͯ͠·͍ɺڞ௨Խ͕ඞཁͱͳΓ·͢ɻ ࠓճͷൃදɺ৽ن࡞͞Εͨڞ௨ 1MBUGPSN ্ʹ͓͚Δ՝ɿ ʰϚʔέλʔΛॳΊͱ͢Δશࣾһ͕ɺ Ϣʔβʔͷ݅ͦͷ "/%03/05ͷҙͷΈ߹ΘͤʹΑΔλʔήςΟϯάΛՄೳͱ͢ΔʱΛɺ ,PUMJOͰ࣮ͨ͠ :".-ϕʔεͷϢʔβʔλʔήςΟϯά%4-ʢಠࣗݴޠʣͱ ͦͷॲཧܥʹΑͬͯղܾͨ͠ࣄྫͷհͱͳΓ·͢ɻ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "HFOEB • ಋೖ λʔήςΟϯά֓ཁͱɺղ͖͘՝ • :".-,PUMJOΛར༻ͨ͠ %4-
ͷ࣮ • • ·ͱΊ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "HFOEB • λʔήςΟϯά֓ཁͱɺղ͖͘՝ • :".-,PUMJOΛར༻ͨ͠ %4- ͷ࣮
• • ·ͱΊ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO λʔήςΟϯάͱͭ·ΓͲ͏͍͏͜ͱ͔ r ͋ΔϚϯΨΞϓϦ։ൃͷݱ ΞϓϦʹىಈ࣌ϙοϓΞοϓػೳ͕ཉ͍͠ Ͱ͢ΑͶ τοϓը໘ʹόφʔग़͍ͨ͠ΑͶ Θ͔Γ·͢
όφʔ࡞ͷΈʢಡΜ͔ͩͲ͏͔ʣͰग़͚͍ͨ͠͠ͳ ࡞Γ·ͬͤ ىಈ࣌ϙοϓΞοϓΛಛఆͷϢʔβʔʢ$47 -JTUʣ ʹରͯ͠ͷΈग़͢Α͏ʹ͍ͨ͠ɻ ֦ு͠·͢ ϢʔβʔΛࢦఆʢ$47ʣͯ͠ 1VTI ௨ΛૹΔػೳ࡞Ζ͏ ͱΓ͋͑ͣ SZ ىಈ࣌ϙοϓΞοϓ࡞ΈࢦఆͰग़͍ͨ͠Μ͚ͩͲ ͦΖͦΖਏ͍ͧɻɻɻ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ͭ·ΓͲ͏͍͏͜ͱ͔ʁ Banner Popup その他A B C ...
全表⽰ ✅ ✅ ✅ ✅ ✅ … 登録時期 ✅ ✅ ❌ ❌ ✅ … 課⾦履歴 ✅ ❌ ✅ ❌ ❌ … 閲覧履歴 ❌ ✅ ❌ ✅ ✅ … ID指定 ❌ ✅ ✅ ✅ ❌ … … … … … … … … 機能 ターゲティング条件
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO Banner Popup その他A B C ... 全表⽰
✅ ❌ ❌ ✅ ❌ … 登録時期 ✅ ✅ ❌ ❌ ✅ … 課⾦履歴 ✅ ❌ ✅ ❌ ❌ … 閲覧履歴 ❌ ✅ ❌ ✅ ✅ … ID指定 ❌ ✅ ✅ ✅ ❌ … … … … … … … … 機能 ターゲティング条件 ͭ·ΓͲ͏͍͏͜ͱ͔ʁ • ਏ͘ͳ͖ͬͯͨɻ • αʔϏεͷͬͯ͜͏͍͏ͷʂʁ • ͋Δఔڞ௨Խ͓͚ͯ͜͠͏ͳΒΜΖ͏ɻ • ͜ͷλʔήςΟϯάॲཧॏ͍ͷͰ 5PQ 1BHF Ͱͬͯཉ͘͠ͳ͍ FUD ͕ӡ༻ෛՙ εϐʔυ༏ઌʢʁʣͰɺ αʔϏε͕͢ΔͱͲ͏ͳΔͷ͔ɾɾɾʁ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ͭ·ΓͲ͏͍͏͜ͱ͔ʁ ターゲティング条件 露出機能
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO &OHJOFFSJOHGPS4DBMF • ݸผʹ࣮͍ͯ͠ΔͱλʔήςΟϯάͷ࣮ɾϝϯςφϯείετ 𝑂 λʔήςΟϯάͷछྨ × 𝑂
ػೳͷ ~ 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ × 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ = 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ! αʔϏεͷʹରͯ͠ͷίετ͕͔͔Δɺͱ͍͏͜ͱɻ ͜ΕΛղܾ͢Δඞཁ͕͋ͬͨɻ ࠷ॳʰͱ͍͑ͳΜͱ͔ͳΔͰ͠ΐʱͷൣғ͕ͩͬͨʜʜ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 8)0 8& "3& • ͜ͷηογϣϯͰհͤͯ͘͞ͷ -*/&ϚϯΨ ͱ͍͏ɺ
ࠃ 5PQ4BMFTɺʹͳΔ͋Δ ΞϓϦͷαʔόʔαΠυࣄྫͱͳΓ·͢ • Λ͑Δӡ༻ͷੵΈॏͶ • ߴτϥϑΟοΫ • ສ 5BSHFUJOHTFD͕࣮ࡍʹඞཁ Apple: https://www.youtube.com/watch?v=aRKayW4LZCg
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 13,PUMJO2VJ[ ग़தͰ͢
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ϦϦʔε͔ΒΛӽ͑ΔΞϓϦͷ λʔήςΟϯά͕ ?ͩͬͨ߹ͷίετ 𝑂 λʔήςΟϯά࣮ͷτʔλϧίετ ~ 𝑂
ػೳͷ ⋅ 𝑂 λʔήςΟϯάͷछྨ ~ 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ⋅ 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ = 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ! = 𝑂 11 ͷϊϋͷੵΈॏͶ ! ͔Βͷ 11年 ! ͔Βͷ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ສTFD ͷλʔήςΟϯάͰ࣮ߦ • ඵؒ ສ
TFDͷ "1* $BMM ͕͋ΔΘ͚Ͱͳ͍ɻ • "1*$BMMͷதͰɺ༷ʑͳλʔήςΟϯά͕ߦΘΕ͍ͯΔ • ྫɿ-*/& ϚϯΨͷىಈ࣌εΫϦʔϯ • Ϣʔβʔొʢ৽نʁطଘʁFUDʣຖʹɺը໘ߏΛม͑Δ • όφʔɾ1PQVQ ͻͱͭͻͱͭΛݟͤΔɾݟͤͳ͍ • ֤छ "# 5FTU • ։ൃྃػೳͷ (SBEVBM 3PMMPVU
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ߹ܭ 5BSHFUJOH r TFD
1,000万/sec とはどれくらいか? = 1回の処理に 1ms かかってしまうとすると 1スレッドで秒間1000回しかターゲティングできず、 1万スレッドが必要。
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ඵؒ ສճΛ͑Δ λʔήςΟϯάΛ࣮ݱ͢Δํ๏ • ٕज़ཁૉΛ "E5FDI
͔Βഈआ ˞ • 'VMMTDSBUDIͷ 1SJWBUF %.1 "VEJFODFཧʣΛ ,PUMJO Ͱ։ൃɾӡ༻ • શͯͷ "1* ϦΫΤετʹରͯ͠ɺ αϒϛϦඵͰ 6TFSͷ "VEJFODF(SPVQ*% 'MBH4FU Λฦ͢ • ͜ͷ 'MBH 4FUʹରͯ͠ɺλʔήςΟϯάΛద༻ ※ https://en.wikipedia.org/wiki/Data_management_platform etc
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 1MBUGPSN͕͋Ε͜͏ͳΔ Targeting Patform (PrivateDMP+α) 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ
! 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ + 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ~ 𝑂(𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ)
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ߟྀ͖͢ϙΠϯτ *0'SFF ཁ • ʰ͜Ε৽نϢʔβʔʹग़͍ͨ͠ʱͱ ͍͏ͱ͖ʹɺग़͚͠ͷλΠϛϯάͰ
৽نϢʔβʔ͔Ͳ͏͔Λ %# ʹ͍ ߹ΘͤΔࣄͰ͖ͳ͍ 1,000万 ターゲティング /sec = 1回の処理に 1ms (1IO) かかってしまうと 1万スレッドが必要。 利⽤開始時期 バナー TargetingPlatform DB
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO -*/&ϚϯΨʹ͓͚Δɺ,PUMJO ্Ͱͷ λʔήςΟϯάͷղ͖ํ "1*ݺͼग़͠։࢝ͷλΠϛϯάͰɺ جຊใʢϢʔβʔ*%ͳͲʣʹՃ͑ͯɺ "VEJFODF(SPVQ*%
ͱݺΕΔ 'MBH 4FU Λ %.1͔Βશͯऔಘ͓ͯ͘͠ NT ྫɿ6TFS"GMBH< > ΫϦΤΠςΟϒʢόφʔɾ1PQVQFUDʣͷϦετ͕ɺ λʔήςΟϯάͱڞʹ༩͑ΒΕΔɻ • ྫɿ͜ͷόφʔΛ GMBHͷϢʔβʔʹදࣔ ϢʔβʔຖʹదͳϑΟϧλϦϯάΛίʔυͰߦ͏
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO λʔήςΟϯάΛͲ͏දݱ͢Δ͔ʁ • "/%03/05ΛؚΉλʔήςΟϯάΛ ʰσʔλʱʢʣͱͯ͠දݱ͍ͨ͠ ʹ/PU-PHJD$PEF • ਓؒͱϓϩάϥϜ͕ޡղແ͘ಡΈॻ͖Ͱ͖Δදݱܗࣜʢ%4-
ઐ༻ݴޠʣ͕ཉ͍͠ • Կނσʔλ %4- ͔ʁ • %#1SPUPDPMʹ҆ఆͯ͠ӬଓԽ 4FSJBMJ[F ग़དྷΔํ๏͕ඞཁ • ਓ͕ؒ "/%03/05ͷҙͷΈ߹ΘͤΛ $.4 ͔Βઃఆ͍ͨ͠ • ઃఆϑΝΠϧʢύϥϝʔλϑΝΠϧʣ্Ͱ׆༻͍ͨ͠
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "HFOEB • ಋೖ λʔήςΟϯά֓ཁͱɺղ͖͘՝ • :".-,PUMJOΛར༻ͨ͠ %4-
ͷ࣮ • 4FSJBMJ[F%FTFSJBMJ[F 1BSTFS ࣮ • &WBMVBUJPOr ࣜධՁ • ·ͱΊ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO %4- 4FS%F 1BSTFS ࣮ • લఏɿ%4-
:".- ϕʔεͱͯ͠ɺ "/%03/05 ͷཧԋࢉࢠ͓Αͼ -FBG /PEF Ͱߏ͞ΕΔ • :".- ࠾༻ཧ༝ɿϋΠϥΠτͳͲΛطଘ &EJUPS .POBDP ʹཔΓ͍ͨ • ύʔε %FTFSJBMJ[F ӬଓԽ 4FSJBMJ[F Λ࣮͍ͨ͠ • ϕʔε ljackson-dataformat-yaml”
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO %4- ͷྫ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO %4- 1BSTF ΛՄೳͱ͢Δ+BDLTPOͷ QPMZNPSQIJTN ରԠ • :".-.BQQFS
ͰɺҎԼͷ༻ʹॻ͍͓ͯ͘ͱ ࠓճͷ %4- Λ ύʔεͰ͖ΔԼ४උ͕ग़དྷΔ • :".- /BUJWF ͷ 5ZQF 'JFME ΛແޮԽ FUD
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "/%03/05ٴͼ -FBG $POEJUJPO Λ ࣔ͢ TFBMFEJOUFSGBDF EBUBDMBTT
• ΫϥεΛ͜͏ఆٛ • 5BSHFUJOH ͱݴ͏֓೦ʢ*OUFSGBDFʣ͕͋ͬͯ "/%03/05 ֤छܕ͕ 4VC5ZQF
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "/%03/05ٴͼ -FBG $POEJUJPO Λ ࣔ͢ TFBMFEJOUFSGBDF EBUBDMBTT
• ΫϥεΛ͜͏ఆٛ • 5BSHFUJOH ͱݴ͏֓೦ʢ*OUFSGBDFʣ͕͋ͬͯ "/%03/05 ֤छܕ͕ 4VC5ZQF
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO %4-1BSTF3FTVMU
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "HFOEB • ಋೖ λʔήςΟϯά֓ཁͱɺղ͖͘՝ • :".-,PUMJOΛར༻ͨ͠ %4-
ͷ࣮ • 4FSJBMJ[F%FTFSJBMJ[F 1BSTFS ࣮ • &WBMVBUJPOr ࣜධՁ • • ·ͱΊ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO %4-&WBMVBUJPO • Ϣʔβʔ Y λʔήςΟϯά ʹ #PPMFBOΛฦ͢
XIFOࣜͰذͯ͠ɺ ίϯύΠϧΤϥʔ͕ग़ͳ͘ͳΔ·ͰຒΊΔ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO *NQMFNFOUBUJPO
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 5FTUJOH&WBMVBUJPO • %4- ͷධՁ͕ग़དྷͨ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 'JMMUIF.JTTJOH1BSUT
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "HFOEB • ಋೖ λʔήςΟϯά֓ཁͱɺղ͖͘՝ • :".-,PUMJOΛར༻ͨ͠ %4-
ͷ࣮ • • ύϑΥʔϚϯε • ֦ுੑ • ·ͱΊ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 1FSGPSNBODF • ࠓճ 4MJEF Ͱհͨ͠ %4- ͷධՁ
TFD PO.#1.4JOHMF$PSF • ࣮ࡍͷෳαʔόʔɾෳ $PSF ڥͰɺ΄ ΅θϩͱݟͳͤΔίετ • *0'SFFධՁ͍ test summary: Benchmark Mode Cnt Score Error Units MyBenchmark.complexTargeting thrpt 5 150221873.429 ± 21629093.823 ops/s MyBenchmark.simpleTargeting thrpt 5 253614332.192 ± 642978.132 ops/s
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 4FBMFEDMBTT $PNQJMFSΛར༻ͨ͠ ҆શͳ %4- ֦ு • %4-ͷ
-FBG5ZQF͕૿͑ͨ߹ɺ ,PUMJO$PNQJMFSʹ (VJEF ͞Ε ͯίϯύΠϧ͕௨Δ·ͰίʔυΛ ॻ͍͍͚࣮ͯ࿙Ε͕ͳ͍ • JT.BUDI5BSHFUJOH Λϝϯόؔʹ ͠ͳ͍ཧ༝ʁ • σʔλʹରͯ͠ 5BSHFUJOH Ҏ֎ʹ ༷ʑͳॲཧΛ͢Δඞཁ͕͋Γɺݟ௨͠ Λ֬อ͔ͨͬͨ͠ɻ • ྫʣDPOWFSU&MBTUJDTFBSDI2VFSZ
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ·ͱΊ • ຊ 5PQ4BMFTʢʹͳΔ͋Δʣ ΞϓϦͷ 4FSWFS
Ͱॻ͔Ε͍ͯΔ • ສλʔήςΟϯάTFDΛ࣮ݱ͢Δ 1SJWBUF %.1 ͷج൫ Ͱॻ͚Δɻ • KBDLTPOEBUBCJOEZBNM Λར༻ͯ͠ :".- ্ͷ %4- Λ ʹ .BQQJOH 1BSTF Ͱ͖Δ r 4FS%F • %4- &WBMVBUJPO ͷ 4FBMFE $MBTT ͳΒ҆৺ɾ؆୯ r &WBM
,PUMJO'FTU -*/&%JHJUBM'SPOUJFS$PSQPSBUJPO End Of doc.